哪个选择两个列表中常见的元素更有效?

时间:2013-06-09 08:42:40

标签: c# linq list where-in

如果我有两个列表并且我想创建一个新的第三个列表,该列表中只有两个列表中的公共元素(查询中的位置)可以使用此代码:

var listC = listB.Join(listA, b => b.ObjectAId, a => a.Id, (b, a) => b).ToList();

这种方式具有O(n)复杂度。

但是,我也可以这样使用select方法:

var lstC = listA.Where(r => listB.Contains(r).ToList();

第二种方式也是O(n)?

如果这两种方式具有相同的效率,那么它们之间存在差异吗?

感谢。

3 个答案:

答案 0 :(得分:3)

var listC = listA.Intersect(listB); // perhaps a .ToList() on the end

这将使用散列来保持尽可能便宜。

答案 1 :(得分:3)

怎么样

var commonElements = listA.Intersect(listB).ToList();

答案 2 :(得分:1)

您可以尝试使用Enumerable.Intersect函数,该函数接受两个列表并将它们转换为包含两个列表中所有元素的列表。如果您希望对象的相等性不基于您的类的引用相等/默认IEqualityComparer<T>,则还会有一个带IEqualityComparer<T>的重载。

以下是您使用它的方式:

var commonElements = listA.Intersect(listB); 
//you can add an IEqualityComparer<T> to the arguments,
//or append .ToList()/.ToArray to make it a list/array.