2013-08-19 39 views
1

我有一個我想要轉換爲樹結構的列表。我怎樣才能將其轉換爲樹狀結構?使用c#遞歸地構建父子關係的樹

我已經看過Build tree type list by recursively checking parent-child relationship C#線程,但由於我班的鍵是字符串,我無法使用該解決方案。請幫助

internal class Program 
{ 
     private static void Main(string[] args) 
     { 
      List<node> nodeList = new List<node>(); 
      node n = new node("A", "A1", null, 1); nodeList.Add(n); 
      n = new node("B", "A2", "A1", 2); nodeList.Add(n); 
      n = new node("C", "A3", "A1", 2); nodeList.Add(n); 
      n = new node("D", "A4", "A1", 2); nodeList.Add(n); 

      n = new node("E", "A5", "A2", 3); nodeList.Add(n); 
      n = new node("F", "A6", "A5", 4); nodeList.Add(n); 
      n = new node("G", "A7", "A3", 3); nodeList.Add(n); 
      n = new node("H", "A8", "A4", 3); nodeList.Add(n); 
      n = new node("I", "A9", "A4", 3); nodeList.Add(n); 
      n = new node("J", "A10", "A4", 3); nodeList.Add(n); 
      n = new node("K", "A11", "A10", 4); nodeList.Add(n); 
      n = new node("L", "A12", "A10", 4); nodeList.Add(n); 
      n = new node("M", "A13", "A12", 5); nodeList.Add(n); 
      n = new node("N", "A14", "A12", 5); nodeList.Add(n); 
      n = new node("O", "A15", "A10", 4); nodeList.Add(n); 

      n = new node("P", "A16", null, 1); nodeList.Add(n); 
      n = new node("Q", "A17", "A16", 2); nodeList.Add(n); 
     } 
} 

public class node 
{ 
     public string name { get; set; } 
     public string key { get; set; } 
     public string parentKey { get; set; } 
     public int level { get; set; } 

     public List<node> Children { get; set; } 

     public node(string Name, string Key, string PK, int Level) 
     { 
      name = Name; 
      key = Key; 
      parentKey = PK; 
      level = Level; 
     } 
} 
+0

反向鏈接樹是硬(ISH)解析成羽翼豐滿的大樹。無法在單個線性傳遞中完成,您需要首先將節點存儲在關聯容器中,然後在第二次傳遞中構建邊... – Medinoc

回答

1

它非常簡單的重新分解到父ID改變從intstring

public static class GroupEnumerable { 

    public static IList<node> BuildTree(this IEnumerable<node> source) 
    { 
     var groups = source.GroupBy(i => i.parentKey); 

     var roots = groups.FirstOrDefault(g => g.Key==null).ToList(); 

     if (roots.Count > 0) 
     { 
      var dict = groups.Where(g => g.Key!=null).ToDictionary(g => g.Key, g => g.ToList()); 
      for (int i = 0; i < roots.Count; i++) 
       AddChildren(roots[i], dict); 
     } 

     return roots; 
    } 

    private static void AddChildren(node node, IDictionary<string, List<node>> source) 
    { 
     if (source.ContainsKey(node.key)) 
     { 
      node.Children = source[node.key]; 
      for (int i = 0; i < node.Children.Count; i++) 
       AddChildren(node.Children[i], source); 
     } 
     else 
     { 
      node.Children = new List<node>(); 
     } 
    } 
}