|
using iWareModel;
|
using System.Collections.Generic;
|
|
namespace iWareCommon.Utils
|
{
|
/// <summary>
|
/// 树形结构中使用的方法
|
/// </summary>
|
public class TreeHelper<T> where T:class, ITreeEntity<T>
|
{
|
/// <summary>
|
/// 将平面的T拼装成类型记录列表转换为以id为键,子记录列表为值的字典
|
/// </summary>
|
/// <param name="planContents">平面的T类型的记录</param>
|
/// <returns>以id为键,子记录列表为值的字典</returns>
|
public static Dictionary<int, List<T>> GetChildrenDictionary(List<T> ts)
|
{
|
//以id为键,子记录列表为值的字典
|
var childrenDictionary = new Dictionary<int, List<T>>();
|
|
foreach (var t in ts)
|
{
|
|
if (!childrenDictionary.ContainsKey(t.ParentId))
|
{
|
childrenDictionary.Add(t.ParentId, new List<T> { t });
|
}
|
else
|
{
|
childrenDictionary[t.ParentId].Add(t);
|
}
|
}
|
|
foreach (var t in ts)
|
{
|
if (childrenDictionary.ContainsKey(t.Id))
|
{
|
t.Children = childrenDictionary[t.Id];
|
}
|
}
|
|
return childrenDictionary;
|
|
}
|
|
/// <summary>
|
/// 判断是否是主键为childId的T记录是否为主键为parentId的T记录的子记录或其本身
|
/// </summary>
|
/// <param name="parentId">主键为parentId的T记录Id</param>
|
/// <param name="childId">主键为childId的T记录Id/param>
|
/// <param name="childrenDictionary">以T记录id为键,T子记录为值的T列表</param>
|
/// <returns>主键为childId的T记录是否为主键为parentId的T记录的子记录或其本身</returns>
|
public static bool IsChildOrEq(int childId, int parentId, Dictionary<int, List<T>> childrenDictionary)
|
{
|
if (parentId == childId)
|
{
|
return true;
|
}
|
|
if (!childrenDictionary.ContainsKey(parentId))
|
{
|
return false;
|
}
|
|
foreach (var child in childrenDictionary[parentId])
|
{
|
if (IsChildOrEq(child.Id, childId, childrenDictionary))
|
{
|
return true;
|
}
|
|
}
|
return false;
|
}
|
|
|
}
|
}
|