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));
答案 0 :(得分:3)
我想问题是LINQ to Objects,即Enumerable.GroupJoin
。所以是的,GroupJoin
(以及Join
)的LINQ实现正在使用最有效的通用查找数据结构之一 - hash table。它可以在reference source中看到,也可以在备注部分的文档中提及(尽管不是直接):
如果comparer为null,则默认的相等比较器Default用于哈希和比较键。
由于散列查找具有O(1)时间复杂度,因此连接操作的复杂度为O(N),而在第二种情况下,它是O(N * M),因此连接肯定更有效。