using MyCode.Project.Infrastructure.Common; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MyCode.Project.Infrastructure.Trees { /// /// 树节点上下文 /// /// 实体类型 /// 输出类型 public class TreeContext : ITreeContext { /// /// 数据源 /// public List> Data { get; set; } /// /// 当前节点 /// public TreeNode Current { get; set; } /// /// 分隔符 /// public string Separator { get; set; } = "."; /// /// 初始化一个类型的实例 /// public TreeContext() : this(null) { } /// /// 初始化一个类型的实例 /// /// 节点 public TreeContext(TreeNode node) { Current = node; Data = new List>(); } /// /// 设置树节点列表数据源 /// /// 键类型 /// 数据源 /// 显示文本选择器 /// ID选择器 /// 父ID选择器 /// public ITreeContext SetItems(List collection, Func textSelector, Func idSelector, Func parentIdSelector) { Data = GenerateTree(collection, textSelector, idSelector, parentIdSelector, Current).ToList(); if (Current != null) { Current.Children = Data; } return this; } /// /// 设置树节点列表数据源 /// /// 键类型 /// 数据源 /// 显示文本选择器 /// ID选择器 /// 父ID选择器 /// 转换选择器 /// public ITreeContext SetItems(List collection, Func textSelector, Func idSelector, Func parentIdSelector, Func convertSelector) { Data = GenerateTree(collection, textSelector, idSelector, parentIdSelector, Current, convertSelector).ToList(); if (Current != null) { Current.Children = Data; } return this; } /// /// 获取当前树节点 /// /// public TreeNode GetTreeNode() { return Current; } /// /// 获取树节点 /// /// public List> GetTrees() { return Data; } /// /// 生成树 /// /// 键类型 /// 数据源 /// 显示文本选择器 /// ID选择器 /// 父ID选择器 /// 父节点 /// 转换选择器 /// internal IEnumerable> GenerateTree(List collection, Func textSelector, Func idSelector, Func parentIdSelector, TreeNode parentNode, Func convertSelector = null) { var level = parentNode == null || parentNode.Level == 0 ? 1 : parentNode.Level + 1; foreach (var c in collection.Where(u => { var selector = parentIdSelector(u); return ((parentNode == null || parentNode.Id == null) && selector == null) || (parentNode?.Id != null && parentNode.Id.Equals(selector)); }).ToList()) { TreeNode node = convertSelector == null ? new TreeNode(textSelector(c), Conv.To(c)) : new TreeNode(textSelector(c), convertSelector(c)); node.Id = idSelector(c); node.ParentId = parentIdSelector(c); node.Level = level; node.Path = parentNode == null || parentNode.Level == 0 ? node.Text : $"{parentNode.Path}{Separator}{node.Text}"; node.Children = GenerateTree(collection, textSelector, idSelector, parentIdSelector, node, convertSelector).ToList(); yield return node; } } } /// /// 树节点上下文 /// /// 实体类型 public class TreeContext : TreeContext, ITreeContext { /// /// 初始化一个类型的实例 /// public TreeContext() : base() { } /// /// 初始化一个类型的实例 /// /// 根节点 public TreeContext(TreeNode rootNode) : base(rootNode) { } } }