C# 将List 转成 树结构
递归方式
1、创建一个树类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | public class TreeNode { /// <summary> /// 子id /// </summary> public string Id { get ; set ; } /// <summary> /// 父id /// </summary> public string ParentId { get ; set ; } /// <summary> /// 名称 /// </summary> public string Name { get ; set ; } /// <summary> /// 子节点 /// </summary> public List<TreeNode> Children { get ; set ; } /// <summary> /// 无参构造函数 /// </summary> public TreeNode() { Children = new List<TreeNode>(); } /// <summary> /// 有参构造函数 /// </summary> /// <param name="id">子id</param> /// <param name="name">名称</param> /// <param name="parentId">父id</param> public TreeNode( string id, string name, string parentId) { this .Id = id; this .Name = name; this .ParentId = parentId; Children = new List<TreeNode>(); } /// <summary> /// 有参构造函数 /// </summary> /// <param name="id">子id</param> /// <param name="name">名称</param> /// <param name="parent">父节点</param> public TreeNode( string id, string name, TreeNode parent) { this .Id = id; this .Name = name; this .ParentId = parent.Id; Children = new List<TreeNode>(); } } |
其中
- ParentId 为继承关键字,可以改成自己需要的。
- Id 的值是检索 parentId 的关键
- Name 是附带该条数据的值,可以新增其他的,但构造函数也同等要加
2、创建递归方法
/// <summary> /// 使用递归方法建树 /// </summary> public static List<TreeNode> BulidTreeByRecursive(List<TreeNode> treeNodes, List<TreeNode> resps, string pID) { resps = new List<TreeNode>(); List<TreeNode> tempList = treeNodes.Where(c => c.ParentId == pID).ToList(); for (int i = 0; i < tempList.Count; i++) { TreeNode node = new TreeNode(); node.Id = tempList[i].Id; node.ParentId = tempList[i].ParentId; node.Name = tempList[i].Name; node.Children = BulidTreeByRecursive(treeNodes, resps, node.Id); resps.Add(node); } return resps; }
3、调用
TreeNode treeNode1 = new TreeNode("1", "山东", "0"); TreeNode treeNode2 = new TreeNode("2", "北京", "0"); TreeNode treeNode3 = new TreeNode("3", "历下区", treeNode1); TreeNode treeNode4 = new TreeNode("4", "高新区", treeNode1); TreeNode treeNode5 = new TreeNode("5", "历城区", treeNode1); TreeNode treeNode6 = new TreeNode("6", "甸柳庄", treeNode3); TreeNode treeNode7 = new TreeNode("7", "济南长途汽车站东站", treeNode6); TreeNode treeNode8 = new TreeNode("8", "朝阳区", treeNode2); TreeNode treeNode9 = new TreeNode("9", "海淀区", treeNode2); TreeNode treeNode10 = new TreeNode("10", "金盏乡", treeNode8); List<TreeNode> list = new List<TreeNode>(); list.Add(treeNode1); list.Add(treeNode2); list.Add(treeNode3); list.Add(treeNode4); list.Add(treeNode5); list.Add(treeNode6); list.Add(treeNode7); list.Add(treeNode8); list.Add(treeNode9); list.Add(treeNode10); List<TreeNode> trees1 = TreeHelper.BulidTreeByRecursive(list, new List<TreeNode>(), "0");
BulidTreeByRecursive参数说明:
1 | 1、第一个参数,数据源,需要将查出来的数据传递过来2、结果数据3、递归的起点,从最高级开始,不断向下查找子数据循环 |
/// <summary> /// 双层循环 /// </summary> /// <param name="treeNodes"></param> /// <returns></returns> public static List<TreeNode> BulidTree(List<TreeNode> treeNodes) { try { List<TreeNode> trees = new List<TreeNode>(); foreach (var treeNode in treeNodes) { if ("0" == (treeNode.ParentId)) { trees.Add(treeNode); } foreach (var it in treeNodes) { if (it.ParentId == treeNode.Id) { treeNode.Children.Add(it); } } } return trees; } catch (Exception ex) { throw ex; } }
调用
List<TreeNode> trees = TreeHelper.BulidTree(list);
1 | 声明:本文来自:C# 将List转成树的两种方式(递归、循环) - 曲琦 - 博客园 (cnblogs.com)仅供学习记录使用,无其他商业目的。递归亲测可用,循环并未测试。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?