c# linq where on object lists 非常慢

c# linq where on object lists incredibly slow

我有一个看起来像这样的设置

foreach(Master m in masters){
   m.details = allDetails.Where(d => d.ID == m.detailID).ToList();
}

masters 和 AllDetails 只是对象列表,这里没有实际的 SQL 运行。我早些时候这样做了。我实际上没有写 "normal" sql 连接查询,因为我希望这种方式相当快...

这 运行 非常慢,对于大约 20k 个主条目需要 20 多秒。

我知道我一定遗漏了一些非常明显的东西,但我就是想不通是什么。解决这个超级常见问题的方法是什么?

对于每个 Master 遍历整个 allDetails 列表。您应该使用分组并创建字典:

var detailsPerMaster = allDetails.GroupBy(d => d.ID)
                                 .ToDictionary(g => g.Key, g => g.ToList());

然后您可以设置您的 details 属性:

foreach(Master m in masters)        
    m.details = detailsPerMaster[m.detailID];

或者为了更好地匹配您的结果:

foreach(Master m in masters)            
    m.details = detailsPerMaster.TryGetValue(m.detailID, out var list) ? list : new List<--detailTypeHere-->();