zoukankan      html  css  js  c++  java
  • TreeBuilder科学的树创建器

    public static class TreeBuilder
        {
            public static List<dynamic> Build(IEnumerable<dynamic> collection, Func<dynamic, int, dynamic> parser, Func<dynamic, bool> rootSelector, Func<dynamic, dynamic, int, bool> childrenSelector)
            {
                if (collection != null && parser != null && rootSelector != null && childrenSelector != null)
                {
                    var roots = collection.Where(rootSelector).Select(item => parser(item, 0)).ToList();
                    roots.ForEach(node => { BuildChildren(collection, node, parser, 1, childrenSelector); });
                    return roots;
                }
                return null;
            }
    
            private static void BuildChildren(IEnumerable<dynamic> collection, dynamic parent, Func<dynamic, int, dynamic> parser, int level, Func<dynamic, dynamic, int, bool> childrenSelector)
            {
                var children = collection.Where(t => childrenSelector(t, parent, level)).Select(item => parser(item, level)).ToList();
                if (children != null && children.Count > 0)
                {
                    parent.state="closed";
                    parent.children=children;
                    children.ForEach(node => { BuildChildren(collection, node, parser, level + 1, childrenSelector); });
                }
            }
        }

    示例:

    string sql = @"SELECT  [Id]
          ,[PId]
          ,[Name]
          ,[OfficeTel]
          ,[Fax]
          ,[SafeTel]
          ,[MSTel]
          ,[ElectricTel]
          ,[Order]
          ,[Type]
      FROM [NEMS].[dbo].[ContactInfo] where [type]=@type order by [Order] ";
               BatchDataHelper helper = new BatchDataHelper("NEMSConnString");
               var list = helper.Query(sql, new List<KeyValuePair<string, object>>() { new KeyValuePair<string, object>("type", type) });
               var tree = TreeBuilder.Build(list, (d, i) =>
               {
                   d.Level = i;
                   
                   return d;
               }, d => d.PId == 0, (d, n, i) => n.Id == d.PId);

    参数一为构件树的数据集合,参数二为树节点转化委托,参数三为根节点选择器,参数四是父子关系选择器.

  • 相关阅读:
    Hander
    N皇后问题--递归回溯
    NYOJ-571 整数划分(三)
    递归--递推之组合数
    深搜最基础题---全排列And组合数
    递归---NYOJ-176 整数划分(二)和NYOJ-279队花的烦恼二
    递归---NYOJ-90整数划分(一)
    线段树---HDU2795Billboard
    输入输出外挂
    线段树---HDU1394Minimum Inversion Number
  • 原文地址:https://www.cnblogs.com/kingge/p/5558058.html
Copyright © 2011-2022 走看看