zoukankan      html  css  js  c++  java
  • 递归构建层级树

      class Program
        {
            static void Main()
            {
                List<MyClass> result = new List<MyClass>();
                result.Add(new MyClass() { DisplayName = "新余", Key = 3, Owner = 1 });
                result.Add(new MyClass() { DisplayName = "宜春", Key = 4, Owner = 1 });
                result.Add(new MyClass() { DisplayName = "杭州", Key = 5, Owner = 2 });
                result.Add(new MyClass() { DisplayName = "义乌", Key = 6, Owner = 2 });
                result.Add(new MyClass() { DisplayName = "江西", Key = 1, Owner = 0 });
                result.Add(new MyClass() { DisplayName = "浙江", Key = 2, Owner = 0 });
             
    
    
                var root = new HierarchyObject<MyClass>() { Data = new MyClass() { DisplayName = "Root", Key = 0 } };
                BuildTree(null, root, result);
    
            }
    
            public static void BuildTree(HierarchyObject<MyClass> parentNode, HierarchyObject<MyClass> root, List<MyClass> list)
            {
                var parentsIntheList = new List<MyClass>();
                foreach (var item in list)
                {
                    if (list.All(li => li.Key != item.Owner && item.Owner != 0))//if a node whose parent not in the list, then we all so add it to the node
                        parentsIntheList.Add(item);
                }
                int parentId = parentNode == null ? 0 : parentNode.Data.Key;
                var filterdList = list.FindAll(item => item.Owner == parentId);
                if (parentNode == null)
                {
                    filterdList.AddRange(parentsIntheList);
                }
    
                foreach (var item in filterdList)
                {
                    var node = new HierarchyObject<MyClass> { Data = item };
                    if (parentNode == null)//only the first level
                    {
                        root.Children.Add(node);
                        BuildTree(node, root, list);
                    }
                    else
                    {
                        parentNode.Children.Add(node);
                        BuildTree(node, root, list);
                    }
                }
            }
        }
    }
     public class MyClass : INodeInfomation
        {
            public string DisplayName { get; set; }
            public string Path { get; set; }
            public int Owner { get; set; }
            public int Key { get; set; }
        }

     思路:

    从父节点出发,只有第一层的节点比较特殊,它们需要直接加到根节点之上,除此之外,所有的节点的都是加在当节点的下面的。

  • 相关阅读:
    XML导入数据库
    文件流 +Excel导出
    LINQ
    Lambda
    多线程编程
    反射
    匿名类
    匿名类
    委托与事件
    ubuntu开放指定端口
  • 原文地址:https://www.cnblogs.com/shineqiujuan/p/3105307.html
Copyright © 2011-2022 走看看