12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- namespace YBEE.EQM.Core
- {
- /// <summary>
- /// 树基类
- /// </summary>
- public interface ITreeNode
- {
- /// <summary>
- /// 获取节点id
- /// </summary>
- /// <returns></returns>
- int GetId();
- /// <summary>
- /// 获取节点父id
- /// </summary>
- /// <returns></returns>
- int 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 int _rootParentId = 0;
- /// <summary>
- /// 设置根节点方法
- /// 查询数据可以设置其他节点为根节点,避免父节点永远是0,查询不到数据的问题
- /// </summary>
- public void SetRootParentId(int 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>
- 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);
- }
- }
- }
|