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);
參數一為構件樹的數據集合,參數二為樹節點轉化委托,參數三為根節點選擇器,參數四是父子關系選擇器.