2016-10-28 42 views
-1

這裏的節點是一個字典<string, List<string>> 和childnodes是一個List<string>和parentnode是一個字符串。 每當我清除孩子節點時,節點中所有密鑰的值都被清除。dictionary [key] = value是引用類型嗎?

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

你只能創建一個'List '。這個對象是一個引用類型。每個密鑰都添加了相同的列表。你需要爲每個鍵創建一個單獨的列表,否則你會得到你描述的行爲。 – 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; 
} 
相關問題