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);
});
}
}
}
}