2016-10-28 3 views
-1

여기 노드는 <string, List<string>> 의 사전이고 childnodes는 List<string>이고 parentnode는 문자열입니다. 자식 노드를 지울 때마다 노드의 모든 키 값이 지워집니다.사전 [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; 
} 
관련 문제