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

如何编写优化的Linq查询构建三级嵌套Demo列表?

优化构建三级嵌套Demo结构的LINQ实现

先把你的Demo类补全初始化(避免空引用问题):

public class Demo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Parent { get; set; }
    public IList<Demo> Children { get; set; } = new List<Demo>();
}

针对大数据量的核心优化思路是提前构建父ID到子节点的快速映射,避免反复遍历整个数据集。下面是具体实现:

核心代码

// 假设原始数据集是List<Demo> rawData
// 先构建父ID到对应子节点的分组映射,只遍历一次原始数据
var parentChildLookup = rawData.ToLookup(demo => demo.Parent);

// 生成三级嵌套结构(这里假设顶层节点的Parent为0,你可以根据实际情况调整判断条件)
var nestedTree = rawData
    .Where(demo => demo.Parent == 0)
    .Select(topNode =>
    {
        // 填充第一级子节点
        var level1Children = parentChildLookup[topNode.Id].ToList();
        // 给每个一级子节点填充第二级子节点
        foreach (var level1Node in level1Children)
        {
            level1Node.Children = parentChildLookup[level1Node.Id].ToList();
        }
        topNode.Children = level1Children;
        return topNode;
    })
    .ToList();

优化说明

  • ToLookup只遍历一次原始集合,生成的映射表支持O(1)时间复杂度的子节点查找,相比每次用Where遍历全量数据,大数据量下性能提升非常显著。
  • 整个流程仅遍历原始数据集两次:一次构建映射,一次筛选顶层节点,后续填充子节点都是基于映射的快速查询,没有多余的遍历操作。

可选优化(处理无效父节点)

如果数据里存在父ID不存在的无效节点,可以用字典替代Lookup,避免键不存在的异常:

var parentChildDict = rawData
    .GroupBy(demo => demo.Parent)
    .ToDictionary(group => group.Key, group => group.ToList());

var nestedTree = rawData
    .Where(demo => demo.Parent == 0)
    .Select(topNode =>
    {
        parentChildDict.TryGetValue(topNode.Id, out var level1Children);
        topNode.Children = level1Children ?? new List<Demo>();
        
        foreach (var level1Node in topNode.Children)
        {
            parentChildDict.TryGetValue(level1Node.Id, out var level2Children);
            level1Node.Children = level2Children ?? new List<Demo>();
        }
        return topNode;
    })
    .ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:50:24