2010-04-25 1 views
1

Как получить из такой строки 'name1 {value1, value2}; name2 {value3}; ... nameN {value12, valueN} 'Преобразование строки в ArrayCollection (C#, см. Строку ниже)

Array или массивы в такой форме: Array = {string, int}; {string, int}; {string, int};

так:

{ 
{ name1 ; value1} 
{ name1 ; value2} 
{ name2 ; value3} 
... 
{ nameN ; valueN} 
} 

в C# (.net)?

+0

Может ли структура быть рекурсивной? Нужно ли проверять его правильность и обрабатывать возможные ошибки ввода, или вы можете предположить, что он будет хорошо сформирован. Могут ли строки содержать полуколоны, скобки или экранированные кавычки и т. Д.? –

+0

нет - нет плохой ввод возможно. нет необходимости проверки. вы можете предположить, что он будет хорошо сформирован. строки экранированы (например, экранирование браузера). – Rella

+1

Какая версия .Net? – SLaks

ответ

1

Если можно предположить, что этот документ будет всегда хорошо сформировавшийся:

List<KeyValuePair<string, int>> results = new List<KeyValuePair<string, int>>(); 
foreach (string line in File.ReadAllLines("input.txt")) 
{ 
    Match match = Regex.Match(line, @"^\s*{\s*(.*?)\s*;\s*(\d+)\s*}\s*$"); 
    if (match.Success) 
    { 
     string s = match.Groups[1].Value; 
     int i = int.Parse(match.Groups[2].Value); 
     results.Add(new KeyValuePair<string,int>(s,i)); 
    } 
} 

foreach (var kvp in results) 
    Console.WriteLine("{0} ; {1}", kvp.Key, kvp.Value); 

Результат:

name1 ; 1 
name1 ; 2 
name2 ; 3 
nameN ; 23 

Если name1, name2, ..., Намюр уникален и вы не» t заботиться о заказе, то вы можете предпочесть использовать Dictionary вместо List. Если вам действительно нужен массив вместо списка (вы, вероятно, нет), вы можете использовать ToArray().

+0

Могу ли я использовать словарь, просто заменяя «List» > results = new Список >(); 'to' Словарь > results = new Словарь >(); '? – Rella

+0

@Ole Jak: Используйте «Словарь », и вам также нужно изменить строку «Добавить» на «results.Add (s, i);». –