gpt4 book ai didi

c# - LINQ Any 与 FirstOrDefault 的性能 != null

转载 作者:IT王子 更新时间:2023-10-29 03:58:02 26 4
gpt4 key购买 nike

我贡献的开源项目 (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.AnyEnumerable.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.AnyQueryable.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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com