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

如何在多层嵌套的Division类对象集合中根据Id查找目标项?

解决多层嵌套Division类按ID查找节点的问题

你的代码只遍历了两层嵌套结构,所以找不到深层的目标节点:

  • lstDivision = Division.Children.ToList() 获取的是根节点(HQ)的直接子节点(HR)
  • SelectMany(d => d.Children) 只展开了HR的直接子节点(Payrolls、Functions),但ID=2000的"Grades"在Functions的子节点里,属于第三层,你的查询没覆盖到这一层,自然返回null。

以下是三种可行的解决方案:

方法1:递归扩展方法(扁平化所有节点)

写一个扩展方法,把整个嵌套结构转换成扁平的集合,再执行查找:

public static IEnumerable<Division> FlattenAllDivisions(this Division root)
{
    // 返回当前节点
    yield return root;
    // 递归遍历所有子节点
    if (root.Children != null)
    {
        foreach (var child in root.Children)
        {
            foreach (var nestedChild in child.FlattenAllDivisions())
            {
                yield return nestedChild;
            }
        }
    }
}

使用示例:

// 假设root是你的根Division对象(ID=1的HQ)
Division targetDivision = root.FlattenAllDivisions().FirstOrDefault(d => d.Id == 2000);

方法2:递归查找方法

直接递归遍历每个节点,找到目标ID就返回:

private static Division FindDivisionById(Division currentNode, int targetId)
{
    // 当前节点就是目标,直接返回
    if (currentNode.Id == targetId)
        return currentNode;
    
    // 遍历所有子节点,递归查找
    if (currentNode.Children != null)
    {
        foreach (var child in currentNode.Children)
        {
            var found = FindDivisionById(child, targetId);
            if (found != null)
                return found;
        }
    }
    
    // 没找到返回null
    return null;
}

使用示例:

Division targetDivision = FindDivisionById(root, 2000);

方法3:迭代遍历(避免递归栈溢出)

如果嵌套层级极深,递归可能导致栈溢出,用队列迭代遍历更安全:

private static Division FindDivisionByIdIterative(Division root, int targetId)
{
    if (root == null) 
        return null;
    
    var nodeQueue = new Queue<Division>();
    nodeQueue.Enqueue(root);
    
    while (nodeQueue.Count > 0)
    {
        var current = nodeQueue.Dequeue();
        if (current.Id == targetId)
            return current;
        
        // 将子节点加入队列,继续遍历
        if (current.Children != null)
        {
            foreach (var child in current.Children)
            {
                nodeQueue.Enqueue(child);
            }
        }
    }
    
    return null;
}

使用示例:

Division targetDivision = FindDivisionByIdIterative(root, 2000);

注意事项

  • 每次遍历前判断Children是否为null,避免空引用异常
  • 如果存在多个ID相同的节点,FirstOrDefault会返回第一个匹配的节点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:35:27