2
schangxiang@126.com
2024-08-26 9a6009b6841523cad86325706e1e4c802a205322
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System.Collections;
 
namespace iWare.Wms.Core
{
    /// <summary>
    /// 树基类
    /// </summary>
    public interface ITreeNode
    {
        /// <summary>
        /// 获取节点id
        /// </summary>
        /// <returns></returns>
        long GetId();
 
        /// <summary>
        /// 获取节点父id
        /// </summary>
        /// <returns></returns>
        long GetPid();
 
        /// <summary>
        /// 设置Children
        /// </summary>
        /// <param name="children"></param>
        void SetChildren(IList children);
    }
 
    /// <summary>
    /// 递归工具类,用于遍历有父子关系的节点,例如菜单树,字典树等等
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class TreeBuildUtil<T> where T : ITreeNode
    {
        /// <summary>
        /// 顶级节点的父节点Id(默认0)
        /// </summary>
        private long _rootParentId = 0L;
 
        /// <summary>
        /// 设置根节点方法
        /// 查询数据可以设置其他节点为根节点,避免父节点永远是0,查询不到数据的问题
        /// </summary>
        public void SetRootParentId(long rootParentId)
        {
            _rootParentId = rootParentId;
        }
 
        /// <summary>
        /// 构造树节点
        /// </summary>
        /// <param name="nodes"></param>
        /// <returns></returns>
        public List<T> Build(List<T> nodes)
        {
            var result = nodes.Where(i => i.GetPid() == _rootParentId).ToList();
            result.ForEach(u => BuildChildNodes(nodes, u));
 
            return result;
        }
 
        /// <summary>
        /// 构造子节点集合
        /// </summary>
        /// <param name="totalNodes"></param>
        /// <param name="node"></param>
        /// <param name="childNodeList"></param>
        private void BuildChildNodes(List<T> totalNodes, T node)
        {
            var nodeSubList = totalNodes.Where(i => i.GetPid() == node.GetId()).ToList();
            nodeSubList.ForEach(u => BuildChildNodes(totalNodes, u));
            node.SetChildren(nodeSubList);
        }
    }
}