zoukankan      html  css  js  c++  java
  • C# List 转 Tree 公共方法

    用C# 写了个List数据结构转树形数据结构的公共扩展方法


            /// <summary>
            /// 将列表转换为树形结构
            /// </summary>
            /// <typeparam name="T">类型</typeparam>
            /// <param name="list">数据</param>
            /// <param name="rootwhere">根条件</param>
            /// <param name="childswhere">节点条件</param>
            /// <param name="addchilds">添加子节点</param>
            /// <param name="entity"></param>
            /// <returns></returns>
            public static List<T> ToTree<T>(this List<T> list, Func<T, T, bool> rootwhere, Func<T, T, bool> childswhere, Action<T, IEnumerable<T>> addchilds, T entity = default(T))
            {
                var treelist = new List<T>();
                //空树
                if (list == null || list.Count == 0)
                {
                    return treelist;
                }
                if (!list.Any<T>(e => rootwhere(entity, e)))
                {
                    return treelist;
                }
    
                //树根
                if (list.Any<T>(e => rootwhere(entity, e)))
                {
                    treelist.AddRange(list.Where(e => rootwhere(entity, e)));
                }
    
                //树叶
                foreach (var item in treelist)
                {
                    if (list.Any(e => childswhere(item, e)))
                    {
                        var nodedata = list.Where(e => childswhere(item, e)).ToList();
                        foreach (var child in nodedata)
                        {
                            //添加子集
                            var data = list.ToTree(childswhere, childswhere, addchilds, child);
                            addchilds(child, data);
                        }
                        addchilds(item, nodedata);
                    }
                }
    
                return treelist;
            }
    
    

    方法说明:


    第一个参数:根节点的条件
    第二个参数:根节点和子节点的关系(注意,这地方如果条件不充分,会导致异常,无限递归)
    第三个参数:当前数据添加子集

    调用示例1、(id--->pid)

    var treedata = list.ToTree<TTest>((r, c) =>
                     {
                         return c.Pid == 0;
                     },
                    (r, c) =>
                    {
                        return r.Id == c.Pid;
                    },
                    (r, datalist) =>
                    {
                        r.Childs = r.Childs ?? new List<TTest>();
                        r.Childs.AddRange(datalist);
                    });
    
    

    调用示例2、(LevelCode)

    treedata2 = liststr2.ToTree<TTest>((r, c) => c.LevelCode.Length == 6, (r, c) =>
                    {
                        if (r == null || c == null)
                        {
                            return false;
                        }
    
                        if ((r.LevelCode.Length + 6 == c.LevelCode.Length) &&
                            r.LevelCode == c.LevelCode.Substring(0, r.LevelCode.Length))
                        {
                            return true;
                        }
                        else
                        {
                            return false;
                        }
    
                    },
                    (r, datalist) => { 
                    r.Childs = r.Childs ?? new List<TTest>();  
                    r.Childs.AddRange(datalist); 
                    });
    
    
  • 相关阅读:
    sqlmap注入分类
    sqlmap简单中文说明
    【Python Learning第一篇】Linux命令学习及Vim命令的使用
    模拟退火算法从原理到实战【基础篇】
    平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
    使用VMWareWorkstation10搭建学习环境笔记
    洛谷P1313 计算系数【快速幂+dp】
    浅析Numpy.genfromtxt及File I/O讲解
    持续交付中高效率与高质量
    持续集成CI与自动化测试
  • 原文地址:https://www.cnblogs.com/simoncai/p/11681983.html
Copyright © 2011-2022 走看看