2012-04-12 5 views
0
 Dictionary<string, string> f = new Dictionary<string, string>(); 
     Dictionary<int, Dictionary<string, string>> lines = new Dictionary<int, Dictionary<string, string>>(); 

     while ((line = sr.ReadLine()) != null) 
     { 
      lineArr = line.Split(','); 
      int x = 0; 
      foreach (string field in lineArr) 
      { 
       f.Add(keys[x], field); 
       x++; 
      } 
      lines.Add(lineIndex, f); 
      f.Clear(); 
      lineIndex++; 

Словарь f является временным, и я хочу сохранить его значение внутри другого Словаря, но после того, как я очистил его(), значение в словарных линиях теряется, я предполагаю, что оно предоставляет какую-то ссылку , Любая идея, как это решить?Словарь словарей теряет свою ценность

+3

'Clear' имеет тенденцию делать это :) – leppie

+0

Вы совершенно правы, он помещает ссылку на словарь внутри другого словаря, а не его копию. Ответ описывает, как бороться с этим поведением. – Servy

+1

Любая конкретная причина, по которой вы используете 'Dictionary >' вместо 'List >'? – covertCoder

ответ

8

Переместить объявление f внутри вашей петли. Тогда вам не придется опустошить его каждый раз, и опорные остался нетронутым:

Dictionary<int, Dictionary<string, string>> lines = new Dictionary<int, Dictionary<string, string>>(); 

while ((line = sr.ReadLine()) != null) 
{ 
    Dictionary<string, string> f = new Dictionary<string, string>(); 

    lineArr = line.Split(','); 
    int x = 0; 
    foreach (string field in lineArr) 
    { 
     f.Add(keys[x], field); 
     x++; 
    } 
    lines.Add(lineIndex, f); 

    lineIndex++; 
2

Переменная f держит ссылку на Dictionary<string, string> объекта. Когда вы добавляете его в другой словарь, вы не создаете новый объект, а только другую ссылку на тот же объект.

Я очень рекомендую просто пойти с f = new Dictionary<string, string>() как путь наименьшего сопротивления здесь.

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