NET 通用方法:把扁平数据转换为树形数据结构【集合】
1.扁平数据为:
Code ParentCode Name Remark 2111011043240001 0 Lv0 2111011043260002 2111011043240001 Lv0-1 2111011043260004 2111011043260002 Lv0-1-1 附属信息1:Lv0-1-1 2111011043260010 2111011043260002 Lv0-1-2 附属信息1:Lv0-1-2 2111011043260016 2111011043260002 Lv0-1-3 附属信息1:Lv0-1-3 2111011043260022 2111011043260002 Lv0-1-4 附属信息1:Lv0-1-4 2111011043260028 2111011043260002 Lv0-1-5 附属信息1:Lv0-1-5 2111011043260032 2111011043240001 Lv0-2 2111011043270034 2111011043260032 Lv0-2-1 附属信息1:Lv0-2-1 2111011043270040 2111011043260032 Lv0-2-2 附属信息1:Lv0-2-2 2111011043270046 2111011043260032 Lv0-2-3 附属信息1:Lv0-2-3 2111011043270050 2111011043240001 Lv0-3 附属信息1:Lv0-3 2111011043270054 2111011043240001 Lv0-5 附属信息1:Lv0-5 2111011043270056 0 Lv1 2111011043270057 2111011043270056 Lv1-1 2111011043270059 2111011043270057 Lv1-1-1 附属信息1:Lv1-1-1 2111011043270063 2111011043270056 Lv1-2 附属信息1:Lv1-2 2111011043270067 2111011043270056 Lv1-3 附属信息1:Lv1-3
2.通用方法
/// <summary> /// 通用方法 /// </summary> /// <param name="dbList">源数据集合</param> /// <param name="parentCode">父级值</param> /// <param name="orderFunc">排序函数</param> /// <returns></returns> public static List<TreeModel> GetChildrenList(List<DbModel> dbList, string parentCode, Func<IEnumerable<TreeModel>, IEnumerable<TreeModel>> orderFunc = null) { var treeList = new List<TreeModel>(); if (dbList.IsNullOrEmpty()) return treeList; // 因为框架原因,DbModel不能进行泛型约束,只有TreeModel能直接取到树形相关字段 var convertTreeList = dbList.MapTo<DbModel, TreeModel>(); // 筛选数据 var whereDbList = convertTreeList.Where(x => parentCode.Equals(x.ParentCode)); // 对数据进行排序 if (!whereDbList.IsNullOrEmpty() && orderFunc != null) whereDbList = orderFunc(whereDbList); if (whereDbList.IsNullOrEmpty()) return treeList; foreach (var item in whereDbList) { var children = GetChildrenList(dbList, item.Code); item.Children = children; treeList.Add(item); } return treeList; } }
3.调用
var treeList = CommonTreeBll<DbModel, TreeModel>.GetChildrenList(dbList, "0", p => p.OrderBy(x => x.Name).ThenBy(x => x.Remark));
4.接口
public interface ITreeBase<TreeModel> { /// <summary> /// 当前节点主键 /// </summary> string Code { get; set; } /// <summary> /// 上级节点主键,默认为0[根节点] /// </summary> string ParentCode { get; set; } /// <summary> /// 子节点集合 /// </summary> List<TreeModel> Children { get; set; } }
5.DbModel & TreeModel
public partial class DbModel { // ... } public class TreeModel : DbModel, ITreeBase<TreeModel > { public List<TreeModel > Children { get; set; } }
分类:
AspNet
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2018-11-02 【git】常用命令