2013-02-12 2 views
0

Я пытаюсь импортировать значения из .txt-файла в мой dictionary. .txt файл отформатирован так:Добавить ключевую пару из файла в Словарь?

Donald Duck, 2010-04-03

И так далее ... есть 1 запись, как, что в каждой строке. Моя проблема возникает, когда я пытаюсь добавить разделенные строки в dictionary.

Я пробую так: scoreList.Add(values[0], values[1]); Но в нем говорится, что имена не существуют в контексте. Надеюсь, кто-то может указать мне в правильном направлении об этом ...

Спасибо!

private void Form1_Load(object sender, EventArgs e) 
    { 
      Dictionary<string, DateTime> scoreList = new Dictionary<string, DateTime>(); 
      string path = @"list.txt"; 
      var query = (from line in File.ReadAllLines(path) 
         let values = line.Split(',') 
         select new { Key = values[0], Value = values[1] }); 

      foreach (KeyValuePair<string, DateTime> pair in scoreList) 
      { 
       scoreList.Add(values[0], values[1]); 
      } 
      textBox1.Text = scoreList.Keys.ToString(); 
    } 

ответ

3

Ваша переменная values относится только к сфере видимости в запросе LINQ. Вы должны перечислить результат запроса, и добавить значения в словарь:

foreach (var pair in query) 
{ 
    scoreList.Add(pair.Key, pair.Value); 
} 

Это, как говорится, LINQ представляет собой способ ToDictionary расширения, который может помочь вам здесь. Вы могли бы заменить петлю:

scoreList = query.ToDictionary(x => x.Key, x => x.Value); 

Наконец, для типов, чтобы быть правильным, вам необходимо преобразовать значение в DateTime с использованием, например, DateTime.Parse.

+0

У меня есть проблема для отображения значений в textBox1 сейчас. Im using: var lines = scoreList.Select (kv => kv.Key + "," + kv.Value.ToString()); textBox1.Text = string.Join (Environment.NewLine, lines); но это только дает пустой результат. У вас есть ключ к тому, почему? –

+0

Извините! Мне удалось заставить его работать сейчас. Проблема заключалась в том, что оно выдало сообщение об ошибке, когда у меня были записи. Записи в файле .txt с одинаковыми именами. System.ArgumentException: элемент с тем же ключом уже добавлен. Что я должен задумать, чтобы позаботиться об этом, так как у меня много Ключей с теми же именами, может быть, словарь не подходит для этого? –

1

Сначала вы делаете это неправильно, вы должны добавить элемент из списка не значение [0] и значения [1] используется в LINQ ..

Dictionary<string, DateTime> scoreList = new Dictionary<string, DateTime>(); 

    string path = @"list.txt"; 

    var query = (from line in File.ReadAllLines(path) 
       let values = line.Split(',') 
       select new { Key = values[0], Value = values[1] }); 

    foreach (var item in query) /*changed thing*/ 
    { 

     scoreList.Add(item.Key, DateTime.Parse(item.Value)); /*changed thing*/ 
    } 

    textBox1.Text = scoreList.Keys.ToString(); 
1

немедленной проблемы с кодом, что values существует только в выражении запроса ... ваша последовательность имеет тип элемента, который является анонимным типом с Key и Value свойствами.

Следующая проблема заключается в том, что вы тогда итерация scoreList, который будет пустым, чтобы начать с ... и нет также никаких признаков того, где вы собираетесь конвертировать string в DateTime. О, и я не уверен, даст ли Dictionary<,>.Keys.ToString() вам что-нибудь полезное.

Вы можете создать словарь достаточно просто, хотя:

var scoreList = File.ReadLines(path) 
        .Select(line => line.Split(',')) 
        .ToDictionary(bits => bits[0], // name 
            bits => DateTime.ParseExact(bits[1], // date 
               "yyyy-MM-dd", 
               CultureInfo.InvariantCulture)); 

Обратите внимание на использование DateTime.ParseExact вместо просто DateTime.Parse - если вы знаете формат данных, вы должны использовать эту информацию.

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