2016-10-28 3 views
-1

здесь узлы - это словарь <string, List<string>> и childnodes - это List<string>, а parentnode - строка. Всякий раз, когда я очищаю дочерние элементы, значения всех ключей в узлах очищаются.словарь [ключ] = значение это ссылочный тип?

public void processData() 
    { 
     var hcols = Input.Columns.Take(Input.Columns.Count).ToList(); 
     var childNodes = new List<string>(); 
     var parentNode = "Default"; 

     for (var i= 1 ; i < hcols.Count -1 ; i++) 
     { 
      var splitString = hcols[i].Name.Split('_'); 

      if (nodes.ContainsKey(splitString[0])) 
      { 
       childNodes.Add(splitString[1]); 
      } 

      else 
      { 
       var childNodes2 = childNodes; 
       if (!nodes.ContainsKey(splitString[0]) && childNodes.Count > 0) 
       { 
        nodes[parentNode] = childNodes2; 
       } 
       nodes.Add(splitString[0], null); 
       parentNode = splitString[0]; 
       childNodes.Clear(); 
       if (splitString.Length > 1) childNodes.Add(splitString[1]); 
      } 
      Array.Clear(splitString, 0, splitString.Length); 
     } 
     nodes[parentNode] = childNodes; 
    } 
+2

Что вы хотите сказать? –

+3

Вы когда-либо создавали один «Список ». Этот объект является ссылочным типом. Тот же список добавляется для каждого ключа. Вам нужно создать отдельный список для каждого ключа, иначе вы получите описанное вами поведение. – Baldrick

ответ

1

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

public void processData() 
{ 
    var hcols = Input.Columns.Take(Input.Columns.Count).ToList(); 
    var childNodes = new List<string>(); 
    var parentNode = "Default"; 

    for (var i= 1 ; i < hcols.Count -1 ; i++) 
    { 
     var splitString = hcols[i].Name.Split('_'); 

     if (nodes.ContainsKey(splitString[0])) 
     { 
      childNodes.Add(splitString[1]); 
     } 

     else 
     { 
      var childNodes2 = new List<string>(childNodes); // depending on your case, you may want a copy here too 
      if (!nodes.ContainsKey(splitString[0]) && childNodes.Count > 0) 
      { 
       nodes[parentNode] = childNodes2; 
      } 
      nodes.Add(splitString[0], null); 
      parentNode = splitString[0]; 
      childNodes = new List<string>(); // instead of clear 
      if (splitString.Length > 1) childNodes.Add(splitString[1]); 
     } 
     Array.Clear(splitString, 0, splitString.Length); 
    } 
    nodes[parentNode] = childNodes; 
} 
Смежные вопросы