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

如何将C#中Tree类扁平列表转换为层级Directory类根对象?

扁平Tree数据转层级Directory结构的最优实现方法

这是处理扁平数据转层级结构的经典场景,最优方案是借助字典实现快速节点查找,把整体时间复杂度控制在O(n)级别,远优于递归查找父节点的O(n²)方案。下面是完整的实现思路和代码:

步骤1:定义目标层级类

首先我们需要定义最终的Directory类,包含名称和子节点列表:

public class Directory
{
    public string Name { get; set; }
    public List<Directory> Children { get; set; } = new List<Directory>();
}

步骤2:实现转换方法

核心思路是先把所有节点存入字典做缓存,再一次性完成父子关联:

public Directory ConvertFlatTreeToHierarchy(List<Tree> flatTreeData)
{
    // 字典用于快速通过Name查找对应的Directory实例
    var directoryLookup = new Dictionary<string, Directory>();
    Directory rootDirectory = null;

    // 第一遍遍历:创建所有Directory实例并缓存
    foreach (var treeEntry in flatTreeData)
    {
        var dir = new Directory { Name = treeEntry.Name };
        directoryLookup[treeEntry.Name] = dir;

        // 记录唯一的根节点(Parent为null的项)
        if (treeEntry.Parent == null)
        {
            rootDirectory = dir;
        }
    }

    // 第二遍遍历:将每个节点挂载到对应的父节点下
    foreach (var treeEntry in flatTreeData)
    {
        if (!string.IsNullOrEmpty(treeEntry.Parent) 
            && directoryLookup.TryGetValue(treeEntry.Parent, out var parentDir))
        {
            parentDir.Children.Add(directoryLookup[treeEntry.Name]);
        }
    }

    return rootDirectory;
}

为什么这是最优方案?

  • 时间效率拉满:两次线性遍历,所有字典操作都是O(1)的时间复杂度,整体耗时和数据量成正比,大数据量下优势极其明显。
  • 空间开销合理:用字典存储所有节点,空间复杂度O(n),这是为了高效查找必须的开销,完全在可接受范围内。
  • 鲁棒性强:通过TryGetValue处理了可能存在的无效父节点(比如数据里有不存在的Parent值),避免程序崩溃。

示例数据转换结果

针对你给出的示例数据,转换后的根节点结构如下:

  • Name: "C:"
    • Children:
      • Name: "System"
        • Children:
          • Name: "Win"
      • Name: "Prog"

内容的提问来源于stack exchange,提问作者Alexandre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:15:23