(精華)2020年6月26日 C#類庫 樹結構幫助類
using System;
using System.Collections.Generic;
using System.Linq;
namespace Core.Util
{
/// <summary>
/// 樹結構幫助類
/// </summary>
public class TreeHelper
{
#region 外部介面
/// <summary>
/// 建造樹結構
/// </summary>
/// <param name="allNodes">所有的節點</param>
/// <returns></returns>
public static List<T> BuildTree<T>(List<T> allNodes) where T : TreeModel, new()
{
List<T> resData = new List<T>();
var rootNodes = allNodes.Where(x => x.ParentId == "0" || x.ParentId.IsNullOrEmpty()).ToList();
resData = rootNodes;
resData.ForEach(aRootNode =>
{
if (HaveChildren(allNodes, aRootNode.Id))
aRootNode.Children = _GetChildren(allNodes, aRootNode);
});
return resData;
}
/// <summary>
/// 獲取所有子節點
/// 注:包括自己
/// </summary>
/// <typeparam name="T">節點型別</typeparam>
/// <param name="allNodes">所有節點</param>
/// <param name="parentNode">父節點</param>
/// <param name="includeSelf">是否包括自己</param>
/// <returns></returns>
public static List<T> GetChildren<T>(List<T> allNodes, T parentNode, bool includeSelf) where T : TreeModel
{
List<T> resList = new List<T>();
if (includeSelf)
resList.Add(parentNode);
_getChildren(allNodes, parentNode, resList);
return resList;
void _getChildren(List<T> _allNodes, T _parentNode, List<T> _resNodes)
{
var children = _allNodes.Where(x => x.ParentId == _parentNode.Id).ToList();
_resNodes.AddRange(children);
children.ForEach(aChild =>
{
_getChildren(_allNodes, aChild, _resNodes);
});
}
}
#endregion
#region 私有成員
/// <summary>
/// 獲取所有子節點
/// </summary>
/// <typeparam name="T">樹模型(TreeModel或繼承它的模型)</typeparam>
/// <param name="nodes">所有節點列表</param>
/// <param name="parentNode">父節點Id</param>
/// <returns></returns>
private static List<object> _GetChildren<T>(List<T> nodes, T parentNode) where T : TreeModel, new()
{
Type type = typeof(T);
var properties = type.GetProperties().ToList();
List<object> resData = new List<object>();
var children = nodes.Where(x => x.ParentId == parentNode.Id).ToList();
children.ForEach(aChildren =>
{
T newNode = new T();
resData.Add(newNode);
//賦值屬性
properties.Where(x => x.CanWrite).ForEach(aProperty =>
{
var value = aProperty.GetValue(aChildren, null);
aProperty.SetValue(newNode, value);
});
//設定深度
newNode.Level = parentNode.Level + 1;
if (HaveChildren(nodes, aChildren.Id))
newNode.Children = _GetChildren(nodes, newNode);
});
return resData;
}
/// <summary>
/// 判斷當前節點是否有子節點
/// </summary>
/// <typeparam name="T">樹模型</typeparam>
/// <param name="nodes">所有節點</param>
/// <param name="nodeId">當前節點Id</param>
/// <returns></returns>
private static bool HaveChildren<T>(List<T> nodes, string nodeId) where T : TreeModel, new()
{
return nodes.Exists(x => x.ParentId == nodeId);
}
#endregion
}
}
相關文章
- C# HTTP幫助類C#HTTP
- NPOI幫助類
- Pgsql幫助類 netcoreSQLNetCore
- (精華)2020年6月26日 C#類庫model IdInputDTOC#
- (精華)2020年6月26日 C#類庫model UserLogTypeC#
- (精華)2020年6月26日 C#類庫model FileEntryC#
- (精華)2020年6月26日 C#類庫model OptionListInputDTOC#
- (精華)2020年6月26日 C#類庫model DynamicModelC#
- (精華)2020年6月26日 C#類庫model RoleTypesC#
- (精華)2020年6月26日 C#類庫model DbTableInfoC#
- (精華)2020年6月26日 C#類庫model AjaxResultC#
- (精華)2020年6月26日 C#類庫model JWTPayloadC#JWT
- (精華)2020年6月26日 C#類庫model ErrorResultC#Error
- (精華)2020年6月26日 C#類庫model TableInfoC#
- (精華)2020年6月26日 C#類庫model BusExceptionC#Exception
- (精華)2020年6月26日 C#類庫model MapAttributeC#
- (精華)2020年6月26日 C#類庫model SelectOptionC#
- (精華)2020年6月26日 C#類庫model PageResultC#
- (精華)2020年6月26日 C#類庫model TreeModelC#
- (精華)2020年6月26日 C#類庫model PageInputC#
- 字元操作普通幫助類字元
- (精華)2020年6月29日 C#類庫 介面簽名校驗C#
- (精華)2020年6月26日 C#類庫model PageInput.TC#
- 開源 - Ideal庫 - Excel幫助類,TableHelper實現(二)IdeaExcel
- 開源 - Ideal庫 - Excel幫助類,TableHelper實現(三)IdeaExcel
- 開源 - Ideal庫 - Excel幫助類,設計思路(一)IdeaExcel
- 開源 - Ideal庫 - Excel幫助類,ExcelHelper實現(四)IdeaExcel
- 開源 - Ideal庫 - Excel幫助類,ExcelHelper實現(五)IdeaExcel
- (精華)2020年6月26日 C#類庫 Enum(擴充套件方法)C#套件
- (精華)2020年6月26日 C#類庫 DataTable(擴充套件方法)C#套件
- C#中誰最快:結構還是類?
- 2024 年 C# 高效開發:精選實用類庫C#
- C#寫一套最全的MySQL幫助類(包括增刪改查)C#MySql
- C# RESTful API 訪問輔助類C#RESTAPI
- 華為幫助泰國生活類應用Wongnai和Line Man解決精準定位及跟蹤能力痛點AI
- MFC介面開發類庫BCG Pro for MFC幫助文件:CBCGPEditCtrl的XML格式XML
- WPF WriteableBitmap透過GDI+繪製幫助類
- 類檔案結構_class類檔案的的結構