2016-10-28 3 views
-1

ここのノードは<string, List<string>> の辞書で、childnodesはList<string>で、parentnodeは文字列です。 子ノードをクリアするたびに、ノード内のすべてのキーの値がクリアされます。辞書[key] =値は参照型ですか?

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 'を1つしか作成しません。このオブジェクトは参照型です。すべてのキーに対して同じリストが追加されています。それぞれのキーごとに別々のリストを作成する必要があります。そうしないと、説明した動作が発生します。 – 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; 
} 
関連する問題