1

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

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) 吗?

如果这两种方式具有相同的效率,那么它们之间有哪些不同之处?

谢谢。

4

3 回答 3

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

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

于 2013-06-09T08:45:27.403 回答
3

怎么样

var commonElements = listA.Intersect(listB).ToList();
于 2013-06-09T08:45:45.457 回答
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.
于 2013-06-09T08:51:02.200 回答