如何通过路径数组构建多层Person树形结构?
路径数组转多层Person树形结构解决方案
问题核心
你需要将分隔符分割的路径数组,转换为Person类的多层树形结构,原代码的主要问题是新建节点未添加到父节点的Children集合,导致树形结构无法正确嵌套。
修复后完整代码
public class Person { public string Name { get; set; } public string FullPath { get; set; } public List<Person> Children { get; set; } } // 构建树形结构的逻辑 string[] list = { "Parent1/Child1/SuperChild1/SupersuperChild1", "Parent1/Child1/SuperChild1/SupersuperChild2", "Parent2/Child2/SuperChild2/SupersuperChild3", "Parent2/Child3/SuperChild3/SupersuperChild4", "Parent2/Child3/SuperChild3/SupersuperChild5" }; var rootNodes = new List<Person>(); foreach (var path in list) { // 清理路径并分割为节点名称数组,去除空条目 var nodeNames = path.Replace("[", "").Replace("]", "/").Split('/', StringSplitOptions.RemoveEmptyEntries); var currentLevelNodes = rootNodes; foreach (var nodeName in nodeNames) { // 查找当前层级是否已有同名节点 var targetNode = currentLevelNodes.FirstOrDefault(n => n.Name == nodeName); if (targetNode == null) { // 创建新节点,仅叶子节点赋值FullPath targetNode = new Person { Name = nodeName, FullPath = nodeName == nodeNames.Last() ? path : null, Children = new List<Person>() }; // 将新节点加入当前层级的集合(根集合或父节点的Children) currentLevelNodes.Add(targetNode); } // 切换到下一层级:当前节点的Children作为下一轮的操作集合 currentLevelNodes = targetNode.Children; } }
关键改进点
- 层级跟踪优化:用
currentLevelNodes变量跟踪当前操作的节点集合(根节点列表或父节点的Children),避免重复从根节点查找,提升效率。 - 节点添加逻辑:新建节点时必须加入到当前层级的集合中,这是原代码缺失的核心步骤,确保节点能正确嵌套到树形结构里。
- 空值防护:添加
StringSplitOptions.RemoveEmptyEntries处理分割后可能出现的空字符串,避免创建无效节点。 - 简化判断逻辑:统一先查找再创建的流程,替代原代码多分支的if-else,代码更易读和维护。
验证效果
运行代码后,rootNodes会包含Parent1和Parent2两个根节点,每个节点的Children层级完全匹配路径结构,叶子节点的FullPath会被正确赋值为完整路径。
内容的提问来源于stack exchange,提问作者Dydaser
相关产品推荐
相关产品推荐

