我贡献的开源项目 (OSP) 代码中有多个地方必须确定集合中的元素是否满足特定条件。
我见过在某些情况下使用 LINQ 表达式 Any(lambda expression)
和在其他情况下使用 FirstOrDefault(lambda expression) != null
但从未想过关于它。
我现在已经到了一个地步,我必须对从数据库查询生成的集合进行一些迭代,并希望优化运行时。
所以我认为 FirstOrDefault(lambda expression) != null
应该比 Any(lambda expression)
快,对吗?
在 FirstOrDefault(lambda expression) != null
的情况下,迭代(可能)在找到满足条件的元素时停止(更坏的情况是迭代整个集合并返回null
).
在 Any(lambda expression)
的情况下,我想即使找到满足条件的元素,迭代也会继续到集合的末尾。
编辑:Jackson Pope 提到并链接了相关的 MSDN 文章,以上内容不正确。
我的想法正确还是我遗漏了什么?
最佳答案
你在这里混合了东西。你在谈论集合,但你似乎没有使用 LINQ to objects 但你正在查询数据库。
LINQ 到对象:
Enumerable.Any
和 Enumerable.FirstOrDefault
应该执行相同的操作,因为它们的代码几乎相同:
FirstOrDefault
:
foreach (TSource source1 in source)
{
if (predicate(source1))
return source1;
}
return default (TSource);
任何
:
foreach (TSource source1 in source)
{
if (predicate(source1))
return true
}
return false;
LINQ 到某些数据库:
您正在使用 Entity Framework、LINQ to SQL 或 NHibernate 并使用 Queryable.Any
和 Queryable.FirstOrDefault
在相应的数据上下文中。
在这种情况下,实际上没有集合,因为这些调用不是在内存对象上执行,而是转换为 SQL。
这意味着,性能差异源于 LINQ 提供程序将代码转换为 SQL 的方式,因此最好先检查创建的语句。它们等价吗?还是它们非常不同(select count(0) from X
vs. select top 1 from X
)?那么不同之处可能在于数据库的查询优化器、索引等等......
关于c# - LINQ Any 与 FirstOrDefault 的性能 != null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8339988/