如何在C#中递归构建List<ABC>类型的多层级对象列表
构建递归层级List的解决方案
我来帮你搞定这个递归构建层级结构的问题!你已经能给子节点添加子对象,现在只需要调整逻辑,把整个树的根节点收集起来并正确组装即可。这里给你一套清晰的实现思路和代码:
核心思路
- 先建立数据映射:把所有数据条目转换成
ABC对象,并用字典存储(键为Value,值为对应的ABC实例),这样能快速查找父节点。 - 区分根节点与子节点:遍历所有数据,Parent为空的就是根节点,直接加入结果列表;非根节点则找到对应的父节点,将自己添加到父节点的
children列表中。 - 自动递归组装:因为每个
ABC对象的children会被动态填充,当处理到深层子节点时,自然会嵌套到对应的父节点下,不需要额外写复杂的递归函数(后续有特殊逻辑可以再扩展)。
完整代码实现
// 先定义原始数据的承载类(模拟你给出的表格数据) public class DataItem { public string Parent { get; set; } public string Value { get; set; } } public List<ABC> BuildHierarchicalList(List<DataItem> dataItems) { // 用字典存储Value到ABC对象的映射,快速查找父节点 var valueToAbcMap = new Dictionary<string, ABC>(); var rootNodes = new List<ABC>(); foreach (var item in dataItems) { // 获取或创建当前Value对应的ABC实例 if (!valueToAbcMap.TryGetValue(item.Value, out var currentAbc)) { currentAbc = new ABC { value = item.Value, children = new List<ABC>() // 初始化children列表,避免空引用异常 }; valueToAbcMap[item.Value] = currentAbc; } // 处理根节点(Parent为空/空字符串) if (string.IsNullOrEmpty(item.Parent)) { rootNodes.Add(currentAbc); } else { // 找到父节点实例,将当前节点加入其children列表 if (valueToAbcMap.TryGetValue(item.Parent, out var parentAbc)) { parentAbc.children.Add(currentAbc); } // 可选:这里可以添加父节点不存在时的异常处理或日志 } } return rootNodes; }
代码关键说明
- 字典映射:
valueToAbcMap确保每个Value只对应一个ABC对象,既避免重复创建,又让父节点查找的时间复杂度降到O(1),效率很高。 - children初始化:每个
ABC对象创建时都初始化children列表,后续添加子节点时不会出现NullReferenceException。 - 自动嵌套逻辑:当处理
C(Parent是A)时,会找到之前创建的A的ABC实例,把C加入它的children;同理D会加入B的children,最终自动形成你想要的多层嵌套结构。
测试用例
把你给出的表格数据转换成List<DataItem>,调用方法就能得到目标结果:
var data = new List<DataItem> { new DataItem { Parent = "", Value = "1" }, new DataItem { Parent = "1", Value = "A" }, new DataItem { Parent = "A", Value = "C" }, new DataItem { Parent = "", Value = "2" }, new DataItem { Parent = "2", Value = "B" }, new DataItem { Parent = "B", Value = "D" }, }; var result = BuildHierarchicalList(data);
返回的result就是你想要的List<ABC>结构,序列化成JSON后和你给出的示例完全一致。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

