使用 LINQ,是否有比 Where()
更快的替代方案方法 List<T>.Contains()
在谓词内,给出完全相同相同的结果?
这是一个例子:
List<int> a = ...
List<int> b = ...
var result = a.Where(x => b.Contains(x)); //very slow
我发现的一种替代方法是使用 Intersect()
方法:
var result = a.Intersect(b);
在 result
变量,a
值顺序被保留。
但是,如果 a
中的值,它不会提供完全相同的结果。包含重复项,因为 Intersect()
运算符仅返回不同的值。
另一种方式:
var result = a.Join(b, x => x, y => y, (x, y) => x);
如果b
,结果又不一样。包含重复项。
还有其他的可能吗?
我想避免什么:
- 创建我自己的 LINQ 扩展方法
- 创建单独的
HashSet
在第一个列表上并使用Contains()
在里面Where()
.
最佳答案
从语义上讲,您想要的是左内连接。 LINQ Join
运算符执行内联接,这很接近,但并不完全相同。幸运的是,您可以使用GroupJoin
来执行左连接。
var query = from n in a
join k in b
on n equals k into matches
where matches.Any()
select n;
另一个选择是将第二个序列中的项目放入 HashSet
中,它比 List
的搜索效率要高得多。 (这类似于 Join/GroupJoin 在内部执行的操作。)
var set = new HashSet<int>(b);
var query = a.Where(n => set.Contains(n));
另一个选择是使用 Join
,就像您所做的那样,但只需首先从 b
中删除所有重复项,因为如果没有重复项,那么它会执行您想要的操作:
var result = a.Join(b.Distinct(), x => x, y => y, (x, y) => x);
关于c# - 是否有一个 LINQ 替代运算符来替代 Where() 运算符,其中包含 List.Contains() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18875121/