Linq GroupJoin与Linq All in Select的效率

时间:2016-08-29 14:21:12

标签: c# linq

Linq是否使用任何排序或其他机制来提高群组加入的效率,因此不必为每个不匹配的项目遍历整个集合?

换句话说, 是这样的:

var x = listA.GroupJoin(
listB, a => a.prop,
b => b.prop,
(a, b) => new { a, b })
.Where(!x.b.Any()).Select(x => x.a);

比这更有效:

var x = listA.Where(a => listB.All(b => b.prop != a.prop));

1 个答案:

答案 0 :(得分:3)

我想问题是LINQ to Objects,即Enumerable.GroupJoin。所以是的,GroupJoin(以及Join)的LINQ实现正在使用最有效的通用查找数据结构之一 - hash table。它可以在reference source中看到,也可以在备注部分的文档中提及(尽管不是直接):

  

如果comparer为null,则默认的相等比较器Default用于哈希和比较键。

由于散列查找具有O(1)时间复杂度,因此连接操作的复杂度为O(N),而在第二种情况下,它是O(N * M),因此连接肯定更有效。