• C#如何不使用递归实现无限层次结构的代码分享[转]


    本文原文出处:http://www.jucoder.com/bbs/thread-8811-0-0.html

    本文和大家分享一下C#如何不使用递归实现无限层次结构的代码,我们从数据库里读取的数据都是无层次结构的二维数据,通过O/RM工具一般都可以直接转换到集合类型,之前一直使用递推将无层次的集合类型转换为有层次的集合类型。现在不用递归实现了无限层次结构。具体代码和分析如下:

    定义对象,这里使用经常用到的部门对象

    public class Department
         {
             /// <summary>
             /// 唯一标识
             /// </summary>
             public int Id { get; set; }
     
             /// <summary>
             /// 部门名称
             /// </summary>
             public string Name { get; set; }
     
             /// <summary>
             /// 上级部门唯一标识
             /// </summary>
             public int ParentId { get; set; }
     
             /// <summary>
             /// 所有直接下一级部门
             /// </summary>
             public IList<Department> ChildDepartments;
         }

    准备测试用的数据集合,这里使用List

     /// <summary>
             /// 取得测试数据
             /// </summary>
             /// <returns></returns>
             public static IList<Department> GetDepartments()
             {
     
                 var l = new List<Department>()
                             {
                                 //ParentId = 0 表示顶层节点
                                 new Department() {Id = 2, Name = "董事会",ParentId = 1},
                                 new Department() {Id = 4, Name = "行政部",ParentId=1},
                                 new Department() {Id = 5, Name = "研发部",ParentId=1},
                                 new Department() {Id = 1, Name = "浙江**股份有限公司",ParentId = 0},
                                 new Department() {Id = 6, Name = "营销中心",ParentId=1},
                                 new Department() {Id = 7, Name = "人力资源部",ParentId=4},
                                 new Department() {Id = 8, Name = "采购部",ParentId =4},
                                 new Department() {Id = 3, Name = "总经理办公室",ParentId =1},
                                 new Department() {Id = 9, Name = ".Net技术研发部",ParentId =5},
                                 new Department() {Id = 10, Name = "销售一部",ParentId =6},
                                 new Department() {Id = 11, Name = "java技术研发部",ParentId =5 },
                                 new Department() {Id = 12, Name = "销售二部",ParentId= 6},
                                 new Department() {Id = 13, Name = "第一项目组",ParentId=9},
                                 new Department() {Id = 14, Name = "华东市场部",ParentId=12},
                                 new Department() {Id = 15, Name = "华南市场部",ParentId=12},
                                 new Department() {Id = 16, Name = "第二项目组" ,ParentId = 9},
                                 new Department() {Id = 17, Name = "上海**集团",ParentId = 0}
     
                            }; 
     
                 return l;
             }

    上面的List集合是没有层次结构的,实际项目中一般来源于数据库的二维表。

    下面将List转换成具有层次结构的List

     public static IList<Department> ToTree(IList<Department> ds)
             {
                 //定义字典类型,将List转换成字典类型,集合中的元素个数是相同的
                 var dic = new Dictionary<int, Department>(ds.Count);
     
                 foreach (var department in ds)
                 {
                     dic.Add(department.Id,department);
                 }
     
                 //通过一次遍历集合,转换成具有层次结构的类型
                 foreach (var department in dic.Values)
                 {
                     if(dic.ContainsKey(department.ParentId))
                     {
                         if (dic[department.ParentId].ChildDepartments ==null)
                             dic[department.ParentId].ChildDepartments = new List<Department>();
     
                         dic[department.ParentId].ChildDepartments.Add(department);
                     }
                 }
     
                 //仅仅选择最顶层节点返回
                 return dic.Values.Where(t => t.ParentId == 0).ToList();
             }

    以下是测试代码

     var t = Util.ToTree(Util.GetDepartments());

     通过调试可以清楚看到当前的List已经具有层次结构了,该集合中只有两个顶层节点的元素了。

  • 相关阅读:
    Truck History(poj 1789)
    Highways poj 2485
    117. Populating Next Right Pointers in Each Node II
    116. Populating Next Right Pointers in Each Node
    115. Distinct Subsequences
    114. Flatten Binary Tree to Linked List
    113. Path Sum II
    109. Convert Sorted List to Binary Search Tree
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
  • 原文地址:https://www.cnblogs.com/xmily/p/3056008.html
Copyright © 2020-2023  润新知