【问题标题】:LINQ and ReSharperLINQ 和 ReSharper
【发布时间】:2013-07-16 07:15:39
【问题描述】:

您好,我有以下代码:

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 的工作原理。

【问题讨论】:

  • 如果它们都与该 ID 不同,您将不得不检查整个列表。即使在第一个示例中。
  • 如果抽屉里还有一只袜子你还没看,你怎么能说那个人X没有红袜子呢?
  • 是的,但是如果您处于列表可能包含具有匹配 ID 的元素的情况,那么它会更快。假设我已经了解 .Any() 如何正常工作。
  • 同样有效 - !Any() 也必须检查所有这些,因为最后一个元素仍然可以满足条件。它只是归结为布尔代数 - NOT OR 等价于 AND NOT。
  • 不行,一旦失败,两个都会停止。

标签: c# linq resharper


【解决方案1】:

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

当您说“如果 none 项满足此条件”(!Any),则必须检查 所有 项才能获得确定的答案。

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

【讨论】:

  • 我认为这里最重要的一点是建议不是为了效率,而是为了可读性。
  • 不过这种情况下没关系。
【解决方案2】:

AnyAll 都会在条件失败时立即停止查看。

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

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

【讨论】:

  • 我明白了——我真的应该意识到这一点,不知道我今天怎么了。谢谢。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 2021-11-24
    • 2021-06-14
    • 1970-01-01
    • 2022-06-17
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多