c# - 是否有一个 LINQ 替代运算符来替代 Where() 运算符,其中包含 List.Contains() 方法

标签 c# linq optimization

使用 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/

相关文章:

c# - 如何通过扩展方法使用对象而不实例化它?

c# - 在 C# 中执行不同事件的多个按键

C# 根据多个条件过滤列表中的项目

linq - 在多层应用程序中,是否应该允许客户端将自己的 linq 表达式发送到服务器?

ruby-on-rails - Unicorn:要使用多少个工作进程?

c - 在 C 中,!~b 会比 b == 0xff 快吗?

jquery - 大型 DOM 树减慢 jQuery 点击事件

c# - C# 如何让进度条在不同的线程中运行

c# - 操作数数据类型时间对于添加运算符无效

c# - 这个 C# 代码使用概念叫什么?它是如何工作的?