选择两个列表中常见的元素效率更高

本文关键字:常见 元素 效率 列表 两个 选择 | 更新日期: 2023-09-27 18:17:39

如果我有两个列表,我想创建一个新的第三个列表,只有两个列表中的公共元素(where in查询)可以使用以下代码:

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

这种方法的复杂度为0 (n)。

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

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

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

如果两种方法的效率相同,它们之间的区别是什么?

谢谢。

选择两个列表中常见的元素效率更高

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

这将使用哈希使其尽可能便宜。

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

您可以尝试使用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.