如何编写优化的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
相关产品推荐
相关产品推荐

