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

标签 c# linq

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

相关文章:

c# - 使用 MVC4 返回值的正确方法

c# - unity 3D中的反转动画

linq - 将单位 -> 单位转换为操作

c# - LINQ 生成序列号

c# - IEnumerable.GroupJoin 和 Entity Framework 对象

linq - LINQ skip & take 是否有不错的性能?

c# - 如果我真的不需要它们,是否应该获取所有数据库表字段?

c# - Visual Studio 2010 SDK -- 如何在 XML 注释组旁边放置装饰?

c# - Grpc 完全异步

c# - Linq to Sql 内部连接