using System; using System.Collections.Generic; using System.Linq; namespace Hncore.Infrastructure.Tree { public class DataTree { /// /// /// /// 得到第一级节点条件 /// 得到孩子得条件 public static DataNode Load(IEnumerable datas, Func topPredicate, Func childPredicate) where TData : new() { var root = new DataNode(new TData() { }); if (datas == null || datas.Count() == 0) return root; var tops = datas.Where(topPredicate); foreach (var p in tops) { LoadChildren(datas, root, p, childPredicate); } return root; } private static void LoadChildren(IEnumerable datas,DataNode topNode, TData p, Func childPredicate) { var pNode = new DataNode(p); pNode.Parent = topNode; topNode.Children.Add(pNode); var childDatas = datas.Where(item=>childPredicate(p,item)) ; if (childDatas.Count() > 0) { foreach (var childData in childDatas) { LoadChildren(datas,pNode, childData, childPredicate); } } } public static void Traverse(DataNode rootNode, Action> act, bool root = true) { if (root) { rootNode.Traverse(act); } else { rootNode.Children.ForEach(item => { item.Traverse(act); }); } } } }