2

嗨,我有以下代码:

if (!_jobs.Any(j => j.Id == emailJob.Id))
{
}

此代码应找到满足条件的任何元素。所以我会假设它应该在找到第一个元素后返回,如下所示:

if (!_jobs.FirstOrDefault(j => j.Id == emailJob.Id) != null)
{
}

Resharper 尝试将此 LINQ 表达式简化为:

if (_jobs.All(j => j.Id != emailJob.Id))
{
}

这对我来说似乎效率较低,因为它必须检查每个元素是否满足逆条件。

抱歉,如果我只是误解了 LINQ 的工作原理。

4

3 回答 3

7

这两个版本是镜像方法,做的工作量完全相同。

当你说“如果没有一个项目满足这个条件”(!Any),那么必须检查所有项目才能得到明确的答案。

ReSharper 的建议很有用,因为它指导您使用更清楚地显示将要发生的事情的方法:All必须检查作业。

于 2013-07-17T16:09:16.510 回答
3

两者都AnyAll在条件失败时立即停止查找。

如果您要寻找的不仅仅是我们的话或轶事证据,您可以从源头上看到它正在做的事情。

反编译的任何和所有方法

All应用谓词后,该方法中有一个额外的反转。这是相对 0 的性能影响,因此代码可读性是主要关注点。

于 2013-07-17T17:38:28.940 回答
1

如果有任何工作与 emailJob id 匹配,则该.Any()方法可以提前中止。出于同样的原因,该.All()方法可以在发现错误的条件后立即停止工作,这将发生在同一个工作中。效率应该差不多。

于 2013-07-17T16:11:21.753 回答