将创建树形数据结构抽象出功能类
1
using
System.Collections.Generic;
2 using System;
3
4 public class TreeTemplate < T >
5 {
6 private readonly List < T > _data = new List < T > ();
7
8 public TreeTemplate(List < T > items)
9 {
10 _data = items;
11 }
12 public List < Node < T >> GetTree(Func < T, bool > isRootPredicate, Func < T, T, bool > isChildPredicate)
13 {
14 var list = _data.FindAll(item => isRootPredicate(item));
15 var result = new List < Node < T >> ();
16 list.ForEach(item => result.Add(GetTree(item, isChildPredicate)));
17 return result;
18 }
19 public Node < T > GetTree(T item, Func < T, T, bool > predicate)
20 {
21 var root = new Node < T > { Item = item };
22 InitializeNode(root, predicate);
23 return root;
24 }
26 private void InitializeNode(Node < T > node, Func < T, T, bool > isChildPredicate)
27 {
28 var lists = FindChild(node, isChildPredicate);
29 foreach (T item in lists)
30 {
31 var subNode = new Node < T > { Item = item };
32 node.Childs.Add(subNode);
33 InitializeNode(subNode, isChildPredicate);
34 }
35 }
36
37 private IEnumerable < T > FindChild(Node < T > node, Func < T, T, bool > isChildPredicate)
38 {
39 return _data.FindAll(item => isChildPredicate(node.Item, item));
40 }
41 }
2 using System;
3
4 public class TreeTemplate < T >
5 {
6 private readonly List < T > _data = new List < T > ();
7
8 public TreeTemplate(List < T > items)
9 {
10 _data = items;
11 }
12 public List < Node < T >> GetTree(Func < T, bool > isRootPredicate, Func < T, T, bool > isChildPredicate)
13 {
14 var list = _data.FindAll(item => isRootPredicate(item));
15 var result = new List < Node < T >> ();
16 list.ForEach(item => result.Add(GetTree(item, isChildPredicate)));
17 return result;
18 }
19 public Node < T > GetTree(T item, Func < T, T, bool > predicate)
20 {
21 var root = new Node < T > { Item = item };
22 InitializeNode(root, predicate);
23 return root;
24 }
26 private void InitializeNode(Node < T > node, Func < T, T, bool > isChildPredicate)
27 {
28 var lists = FindChild(node, isChildPredicate);
29 foreach (T item in lists)
30 {
31 var subNode = new Node < T > { Item = item };
32 node.Childs.Add(subNode);
33 InitializeNode(subNode, isChildPredicate);
34 }
35 }
36
37 private IEnumerable < T > FindChild(Node < T > node, Func < T, T, bool > isChildPredicate)
38 {
39 return _data.FindAll(item => isChildPredicate(node.Item, item));
40 }
41 }
使用TreeTemplate需要提供两个判定函数原型为
public static bool IsRootPredicate(T item) -----判定Item是否为根节点
public static bool IsChildPredicate(T item1, T item2) ---- 判定item1是否为item2的父节点
//
初始化一个List<T>,比如从数据库里面抓取
_data.Add( new Item { Id = 1 , ParentId = 0 , Name = " Item1 " , No = " 01 " });
_data.Add( new Item { Id = 2 , ParentId = 0 , Name = " Item2 " , No = " 02 " });
_data.Add( new Item { Id = 3 , ParentId = 0 , Name = " Item3 " , No = " 0101 " });
_data.Add( new Item { Id = 11 , ParentId = 1 , Name = " Item11 " , No = " 0201 " });
_data.Add( new Item { Id = 12 , ParentId = 1 , Name = " Item12 " , No = " 0202 " });
_data.Add( new Item { Id = 121 , ParentId = 12 , Name = " Item121 " , No = " 020201 " });
var tree = new TreeTemplate < Item > (_data);
// 获取树形数据结构
List < Node < Item >> nodes = tree.GetTree(IsRoot, IsChild);
//判定是否为根节点
private static bool IsRoot(Item item)
{
return item.ParentId == 0 ;
}
// 父子判定条件 - 根据Id及ParentId
private static bool IsChild(Item item1, Item item2)
{
return item1.Id == item2.ParentId;
}
_data.Add( new Item { Id = 1 , ParentId = 0 , Name = " Item1 " , No = " 01 " });
_data.Add( new Item { Id = 2 , ParentId = 0 , Name = " Item2 " , No = " 02 " });
_data.Add( new Item { Id = 3 , ParentId = 0 , Name = " Item3 " , No = " 0101 " });
_data.Add( new Item { Id = 11 , ParentId = 1 , Name = " Item11 " , No = " 0201 " });
_data.Add( new Item { Id = 12 , ParentId = 1 , Name = " Item12 " , No = " 0202 " });
_data.Add( new Item { Id = 121 , ParentId = 12 , Name = " Item121 " , No = " 020201 " });
var tree = new TreeTemplate < Item > (_data);
// 获取树形数据结构
List < Node < Item >> nodes = tree.GetTree(IsRoot, IsChild);
//判定是否为根节点
private static bool IsRoot(Item item)
{
return item.ParentId == 0 ;
}
// 父子判定条件 - 根据Id及ParentId
private static bool IsChild(Item item1, Item item2)
{
return item1.Id == item2.ParentId;
}