2013-06-02 4 views
0

У меня есть текстовый файл, и мне нужно поместить все четные строки в словарь и все четные строки в значение словаря. Какое лучшее решение моей проблемы?Преобразование txt-файла в словарь <string, string>

int count_lines = 1; 
Dictionary<string, string> stroka = new Dictionary<string, string>(); 

foreach (string line in ReadLineFromFile(readFile)) 
{ 
    if (count_lines % 2 == 0) 
    { 
     stroka.Add Value 
    } 
    else 
    { 
     stroka.Add Key 
    } 

    count_lines++; 
} 
+2

Что такое ключевое значение? Номер строки '2n-1' является ключом и' 2n' является значением? – Andrei

ответ

2

Вы, вероятно, хотите сделать это:

var array = File.ReadAllLines(filename); 
for(var i = 0; i < array.Length; i += 2) 
{ 
    stroka.Add(array[i + 1], array[i]); 
} 

Это читает файл с шагом двух вместо каждой строки отдельно.

Я полагаю, вы хотели использовать эти пары: (2,1), (4,3), .... Если нет, пожалуйста, измените этот код в соответствии с вашими потребностями.

+2

Его собственное решение было потоковым, но вашему решению требуется загрузить весь файл в память перед форматированием словаря. Ваше решение требует в два раза больше памяти –

7

Попробуйте это:

var res = File 
    .ReadLines(pathToFile) 
    .Select((v, i) => new {Index = i, Value = v}) 
    .GroupBy(p => p.Index/2) 
    .ToDictionary(g => g.First().Value, g => g.Last().Value); 

Идея состоит в том, чтобы сгруппировать все линии по парам. Каждая группа будет иметь ровно два элемента: ключ как первый элемент, а значение - второй.

Demo on ideone.

0
String fileName = @"c:\MyFile.txt"; 
    Dictionary<string, string> stroka = new Dictionary<string, string>(); 

    using (TextReader reader = new StreamReader(fileName)) { 
    String key = null; 
    Boolean isValue = false; 

    while (reader.Peek() >= 0) { 
     if (isValue) 
     stroka.Add(key, reader.ReadLine()); 
     else 
     key = reader.ReadLine(); 

     isValue = !isValue; 
    } 
    } 
1

Вы можете прочитать построчно и добавить в словарь

public void TextFileToDictionary() 
{ 
    Dictionary<string, string> d = new Dictionary<string, string>(); 

    using (var sr = new StreamReader("txttodictionary.txt")) 
    { 
     string line = null; 

     // while it reads a key 
     while ((line = sr.ReadLine()) != null) 
     { 
      // add the key and whatever it 
      // can read next as the value 
      d.Add(line, sr.ReadLine()); 
     } 
    } 
} 

Таким образом, вы получите словарь, и если у вас есть нечетные строки, последняя запись будет иметь нулевое значение.

Смежные вопросы