FirstOrDefault()、SingleOrDefault()、Any() 等...哪个最快?

Posted

技术标签:

【中文标题】FirstOrDefault()、SingleOrDefault()、Any() 等...哪个最快?【英文标题】:FirstOrDefault(), SingleOrDefault(), Any(), etc... Which One Is The Fastest? 【发布时间】:2012-06-14 23:10:00 【问题描述】:

关于上述和/或包括其他方法,如果您正在搜索一条记录,并且只有一条记录存在,那么哪一个会执行得最快?例如,我想确保一旦它找到正在查询的值,我正在寻找一个会立即返回它而不搜索剩余记录的值。

【问题讨论】:

取决于查询提供者。 Any 不返回值,它返回一个标志,指示值是否存在。 Any() 不返回记录。 FirstOrDefault可能是获取单条记录的最快方式,但不保证只有一条记录。 很好。但为了安心,我假设它在找到匹配值后立即返回? 这些方法的语义不一样。 【参考方案1】:

如果你有这个想法,你可能会解决它。

FirstOrDefault 枚举集合直到找到匹配项

SingleOrDefault 枚举整个集合以确保项目恰好出现一次

这意味着SingleOrDefault 不能比FirstOrDefault 快。但它确实有点依赖于查询提供程序的实现

编辑:

任何都可以更快地实现。考虑一个 SQL 实现:

Select Top 1 from myTable //(its not quite this but this implementation but it will be similar)

将执行得比:

Select Top 1 from myTable where <somecondition>

【讨论】:

最后一件事,如果不存在记录,是否返回空值?我“认为”它是我使用过的 Single(),当没有任何返回时抛出异常。 如果不存在记录,则 singleOrDefault 和 FirstOrDefault 都返回对象的默认值(大多数情况下为 null)。使用 .First 或 .Single 如果集合不包含匹配项,则会引发异常 另见...LINQ: When to use SingleOrDefault vs. FirstOrDefault with filtering criteria 和 When to use .First and when to use .FirstOrDefault with LINQ?【参考方案2】:

只有当您想要在有 0 个或多个结果时强制异常时才应使用 Single(和 SingleOrDefault)。典型的 SQL 实现是

Select Top 2 * from table

另一方面,First 通常会在找到第一个匹配项后短路。在 TSQL 中

Select Top 1 * from table

Any 用于指示是否至少找到一个匹配项(并在找到后短路)。在 TSQL 中,这使用 Exists。

在您的情况下,由于您需要结果值,因此发出单独的请求(使用 Any)然后执行 Single 是没有用的。相反,只需使用 FirstOrDefault 然后检查返回结果是否为 null。

var foo = table.FirstOrDefault(t => t.bar == val);
if (null != foo)
   ...

从存在的表中选择 1

【讨论】:

以上是关于FirstOrDefault()、SingleOrDefault()、Any() 等...哪个最快?的主要内容,如果未能解决你的问题,请参考以下文章

Dns.GetHostAddresses 与 First() 或 FirstOrDefault() 一起使用啥

我如何处理 .FirstOrDefault 方法?

FirstOrDefault()、SingleOrDefault()、Any() 等...哪个最快?

为啥在 LINQ 中使用 First 而不是 FirstOrDefault? [复制]

为啥 LINQ 中的 LastOrDefault(predicate) 比 FirstOrDefault(predicate) 快

First 和 FirstOrDefault , Last 和 LastOrDefault 有啥区别 [重复]