如何在多层嵌套的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
相关产品推荐
相关产品推荐

