using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace Lib
{
public class Range
{
public List<object> Values = new List<object>();
public static Range Create(string v, object[] array)
{
var rv = replaceLetters(v);
var ret = new Range();
if (v.Contains(";"))
{
ret.Values.AddRange(v.Split(';'));
}
if (v.Contains(":"))
{
var splited = rv.Split(':');
if (char.IsLetter(Convert.ToChar(splited[0])))
{
var first = Convert.ToInt32(splited[0]);
var second = Convert.ToInt32(splited[1]);
for (var i = first; i <= second; i++)
{
ret.Values.Add(array[i]);
}
}
else
{
var r = "abcdefghijklmnopqrstuvwxyz".ToCharArray();
var first = Convert.ToInt32(splited[0]);
var second = Convert.ToInt32(splited[1]);
for (var i = first; i <= second; i++)
{
ret.Values.Add(r[i]);
}
}
}
return ret;
}
public static Range Create(string v)
{
return Create(v, new List<string>().ToArray());
}
private static string replaceLetters(string s)
{
var replacements = getLetters();
var regex = new Regex(String.Join("|", replacements.Keys.Select(Regex.Escape)));
var replaced = regex.Replace(s, m => replacements[m.Value].ToString());
return replaced;
}
private static Dictionary<string, int> getLetters()
{
const string abc = "abcdefghijklmnopqrstuvwxyz";
return abc.ToDictionary(l => l.ToString(), l => abc.IndexOf(l));
}
#region "operators"
public static implicit operator Range(string s)
{
return Create(s);
}
public static explicit operator List<object>(Range l)
{
return l.Values;
}
public static Range operator +(Range r1, Range r2)
{
var r = new Range();
r.Values.AddRange(new[] { r1 });
r.Values.AddRange(new[] { r2 });
return r;
}
#endregion
}
}