سلام. منظورم اینه که با این محدودیت ها باید کلید ها ثابت باشن. مثلا کدتون توی این مثالی که قرار دادید فقط باید دارای کد های status، id، date و text رو داشته باشه. برای این حالت من کدی نوشتم که امیدوارم نیازتون رو برآورده کنه:
enum itemType
{
status,
date,
id,
text
}
class item
{
public itemType type;
public string value;
}
class items : List<item>
{
public items() { }
public items(string line)
{
item itm;
string[] enums = Enum.GetNames(typeof(itemType));
foreach (string en in enums)
{
if (line.Length == 0)
return;
while (char.IsWhiteSpace(line[0]))
line = line.Remove(0, 1);
if (line.ToLower().StartsWith(en))
{
itm = new item();
itm.type = (itemType)Enum.Parse(typeof(itemType), en);
line = line.Remove(0, en.Length);
while (!char.IsLetterOrDigit(line[0]))
line = line.Remove(0, 1);
itm.value = "";
switch (itm.type)
{
case itemType.date:
int ind = line.ToLower().IndexOf("m");// am or pm
if (ind < 0)
{
ind = 0;
while (!char.IsWhiteSpace(line[ind]))
ind++;
ind--;
}
itm.value = line.Substring(0, ind + 1);
line = line.Remove(0, ind + 1);
break;
case itemType.id:
while (!char.IsDigit(line[0]))
line = line.Remove(0, 1);
while (char.IsDigit(line[0]))
{
itm.value += line[0].ToString();
line = line.Remove(0, 1);
}
break;
case itemType.status:
while (!char.IsWhiteSpace(line[0]))
{
itm.value += line[0].ToString();
line = line.Remove(0, 1);
}
break;
case itemType.text:
int ind1=-1, ind2=-1;
foreach (string en0 in enums)
{
if (ind1 < 0)
{
ind1 = line.ToLower().IndexOf(en0);
continue;
}
if ((ind2 = line.ToLower().IndexOf(en0)) > 0 && ind2 < ind1)
ind1 = ind2;
}
if (ind1 > 0)
itm.value = line.Substring(0, ind1);
else
itm.value = line;
break;
}
this.Add(itm);
}
}
}
}
class itemss : List<items>
{
public itemss() { }
public itemss(string[] lines)
{
foreach (string line in lines)
this.Add(new items(line));
}
public items this[itemType type]
{
get
{
items _itms = new items();
foreach (items itms in this)
{
foreach (item itm in itms)
{
if (itm.type == type)
{
_itms.Add(itm);
break;
}
}
}
return _itms;
}
}
}
public void Check()
{
string data = @"Status:Right Date:2014/01/01 6:20:00 PM Id:0111 Text:My Name is:ashkan
Status:Left Date:2014/01/02 Id:0112 Text:Nevis";
string[] lines = data.Replace("\r\n", "\n").Split('\n');
itemss _itemss = new itemss(lines);
items status = _itemss[itemType.status];
items dates = _itemss[itemType.date];
items ids = _itemss[itemType.id];
items texts = _itemss[itemType.text];
}
امیدوارم که محدودیتها بیشتر نشن همینطوریشم به زور کتک درست شده