77 lines
2.5 KiB
C#
77 lines
2.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Linq.Expressions;
|
|
|
|
namespace IRaCIS.Core.Infrastructure.Extention
|
|
{
|
|
public static class ListTreeExtensions
|
|
{
|
|
/// <summary>
|
|
/// 将列表转换为树形结构
|
|
/// </summary>
|
|
/// <typeparam name="T">类型</typeparam>
|
|
/// <param name="list">数据</param>
|
|
/// <param name="rootWhere">根条件</param>
|
|
/// <param name="childsWhere">节点条件</param>
|
|
/// <param name="addChilds">添加子节点</param>
|
|
/// <param name="childEntity"></param>
|
|
/// <returns></returns>
|
|
public static List<T> ToTree<T,Tkey>(this List<T> list, Func<T, T, bool> rootWhere, Func<T, T, bool> childsWhere, Action<T, IEnumerable<T>> addChilds, Func<T, Tkey> orderSelector, T childEntity = default)
|
|
{
|
|
if (rootWhere is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(rootWhere));
|
|
}
|
|
|
|
if (childsWhere is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(childsWhere));
|
|
}
|
|
|
|
if (addChilds is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(addChilds));
|
|
}
|
|
|
|
if (orderSelector is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(orderSelector));
|
|
}
|
|
|
|
var treelist = new List<T>();
|
|
//空树
|
|
if (list == null || list.Count == 0)
|
|
{
|
|
return treelist;
|
|
}
|
|
if (!list.Any(e => rootWhere(childEntity, e)))
|
|
{
|
|
return treelist;
|
|
}
|
|
//树根
|
|
if (list.Any(e => rootWhere(childEntity, e)))
|
|
{
|
|
treelist.AddRange(list.Where(e => rootWhere(childEntity, e)).OrderBy(orderSelector));
|
|
}
|
|
//树叶 item 是根
|
|
foreach (var item in treelist)
|
|
{
|
|
if (list.Any(e => childsWhere(item, e)))
|
|
{
|
|
var nodedata = list.Where(e => childsWhere(item, e)).OrderBy(orderSelector).ToList();
|
|
|
|
foreach (var child in nodedata)
|
|
{
|
|
//添加子集
|
|
var data = list.ToTree(childsWhere, childsWhere, addChilds, orderSelector, child);
|
|
|
|
addChilds(child, data);
|
|
}
|
|
addChilds(item, nodedata);
|
|
}
|
|
}
|
|
return treelist;
|
|
}
|
|
}
|
|
} |