TreeTemplate树模板

将创建树形数据结构抽象出功能类

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 }

使用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;
}

源码下载

转载于:https://www.cnblogs.com/rroo/archive/2011/03/16/1986016.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值