You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:49:09