using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 智能仓储WCS管理系统 { /// /// 树节点 /// public interface ITreeNode { /// /// 主键Id /// public object Id { get; set; } /// /// 父Id /// public object Pid { get; set; } /// /// 子节点 /// public List Children { get; set; } } /// /// 树节点扩展 /// public static class TreeNodeEx { /// /// 转为树结构 /// /// 树节点 /// 树节点带子节点(Children) public static List ToTree(this List treeNodes) where T : ITreeNode { if (treeNodes == null || !treeNodes.Any()) return treeNodes ?? new List(); if (treeNodes.Any(o => o.Id == o.Pid)) throw new Exception("存在id和pid相同的数据,无限循环引用"); var group = treeNodes.GroupBy(x => x.Pid).ToDictionary(x => x.Key, s => s.ToList()); foreach (var item in treeNodes) { if (group.ContainsKey(item.Id)) { var treeNode = group[item.Id]; if (treeNode.Any(o => o.Id == item.Pid && o.Pid == item.Id)) throw new Exception("存在id和pid交叉引用(如:{Id='我是你',Pid='你是我'} 和 {Id='你是我',Pid='我是你'})"); if (item.Children == null) item.Children = new List(); item.Children.AddRange(treeNode); } } //查找顶级节点 var ids = treeNodes.Select(o => o.Id).Distinct(); var pids = treeNodes.Select(o => o.Pid).Distinct(); var c = pids.Except(ids); return group.Where(o => c.Contains(o.Key)).SelectMany(o => o.Value).ToList(); } /// /// 将指定的id节点转为树结构 /// /// 树节点 /// id节点 /// 树节点带子节点(Children) public static T? ToTree(this List treeNodes, object id) where T : ITreeNode { if (treeNodes == null || !treeNodes.Any()) return default(T); if (treeNodes.Any(o => o.Id == o.Pid)) throw new Exception("存在id和pid相同的数据,无限循环引用"); var group = treeNodes.GroupBy(x => x.Pid).ToDictionary(x => x.Key, s => s.ToList()); foreach (var item in treeNodes) { if (group.ContainsKey(item.Id)) { var treeNode = group[item.Id]; if (treeNode.Any(o => o.Id == item.Pid && o.Pid == item.Id)) throw new Exception("存在id和pid交叉引用(如:{Id='我是你',Pid='你是我'} 和 {Id='你是我',Pid='我是你'})"); if (item.Children == null) item.Children = new List(); item.Children.AddRange(treeNode); } } return treeNodes.FirstOrDefault(o => o.Id == id); } /// /// 转为树节点 /// /// 树节点 /// 树节点带子节点(Children) public static List ToTreeNode(this List treeNodes) where T : ITreeNode { if (treeNodes == null || !treeNodes.Any()) return treeNodes ?? new List(); List trees = new List(); foreach (var item in treeNodes) { trees.Add(item); if (item.Children != null && item.Children.Any()) { var aaa = ToTreeNode(item.Children); trees.AddRange(aaa); } } return trees; } } }