使用LINQ构建递归层级结构的技术求助
嘿,我懂你这种卡了好几个小时的憋屈感——明明知道要用LINQ加递归,可就是摸不准怎么把逻辑串起来。我帮你整理了一个可行的实现方案,你可以参考下:
解决方案思路
首先我们需要把目录数据按父节点分组,这样能快速定位每个节点下的子节点;再通过递归逐层遍历节点,生成带缩进的层级文本,完美匹配你要的结构。
完整实现代码
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp14 { class Program { static void Main(string[] args) { // 替换成你自己的实际目录数据即可 var dir = new[] { new KeyValuePair<string, string>("", "Root"), new KeyValuePair<string, string>("Root", "Folder1"), new KeyValuePair<string, string>("Root", "Folder2"), new KeyValuePair<string, string>("Folder1", "SubFolder1a"), new KeyValuePair<string, string>("Folder2", "SubFolder2a"), new KeyValuePair<string, string>("SubFolder2a", "DeepFolder") }; var result = DoSomething(dir); Console.WriteLine(result); } static string DoSomething(KeyValuePair<string, string>[] dir) { // 用LINQ按父节点分组,生成父节点到子节点列表的映射 var groupedDir = dir .GroupBy(kv => kv.Key) .ToDictionary(g => g.Key, g => g.Select(kv => kv.Value).ToList()); // 从根节点(这里用空字符串作为根节点的父键,可根据你的数据调整)开始递归构建层级 return BuildHierarchy("", groupedDir, 0); } static string BuildHierarchy(string parentKey, Dictionary<string, List<string>> groupedDir, int indentLevel) { // 如果当前父节点没有子节点,直接返回空字符串 if (!groupedDir.TryGetValue(parentKey, out var children)) return string.Empty; // 每层级缩进2个空格,可按需调整 var indent = new string(' ', indentLevel * 2); var hierarchyLines = new List<string>(); foreach (var child in children) { // 添加当前节点的文本行 hierarchyLines.Add($"{indent}- {child}"); // 递归处理当前节点的子节点,缩进层级+1 hierarchyLines.Add(BuildHierarchy(child, groupedDir, indentLevel + 1)); } // 拼接所有行并过滤空行,避免多余换行 return string.Join(Environment.NewLine, hierarchyLines.Where(line => !string.IsNullOrEmpty(line))); } } }
关键逻辑说明
- LINQ分组:通过
GroupBy和ToDictionary把原始数据转换成父键对应子节点列表的字典,让子节点查找效率大幅提升。 - 递归遍历:
BuildHierarchy方法负责逐层深入,indentLevel参数控制当前层级的缩进量,每往下一层就增加缩进,保证结构清晰。 - 文本拼接:用
Environment.NewLine实现跨平台换行,最后过滤空行让输出更整洁。
示例输出
- Root - Folder1 - SubFolder1a - Folder2 - SubFolder2a - DeepFolder
如果你的根节点父键不是空字符串,只需要修改DoSomething里调用BuildHierarchy的初始父键参数就行。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

