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