【发布时间】:2012-02-20 02:26:51
【问题描述】:
我经常想检查提供的值是否与列表中的值匹配(例如在验证时):
if (!acceptedValues.Any(v => v == someValue))
{
// exception logic
}
最近,我注意到 ReSharper 要求我将这些查询简化为:
if (acceptedValues.All(v => v != someValue))
{
// exception logic
}
显然,这在逻辑上是相同的,也许更易读(如果你做了很多数学),我的问题是:这会导致性能下降吗?
感觉应该(即.Any() 听起来像是短路,而.All() 听起来不像),但我没有什么可以证实这一点。有没有人更深入地了解查询是否会解决相同的问题,或者 ReSharper 是否让我误入歧途?
【问题讨论】:
-
你试过反汇编 Linq 代码看看它在做什么吗?
-
在这种情况下,我实际上会选择 if(!acceptedValues.Contains(someValue)),但当然这不是问题 :)
-
@csgero 我同意。以上是对真实逻辑的简化(也许是过度简化)。
-
“感觉应该(即 .Any() 听起来像是短路,而 .All() 听起来却没有)”——不适合任何有直觉的人。您注意到的逻辑等价意味着它们同样可以短路。想了想,只要遇到不合格的情况,所有人都可以退出。
-
我并不普遍同意 ReSharper 的观点。写出明智的思路。如果您想在缺少必需项的情况下引发异常:
if (!sequence.Any(v => v == true))。如果您希望仅在一切都符合特定规范的情况下继续:if (sequence.All(v => v < 10))。
标签: c# .net performance linq resharper