All
根据ILSpy的实现(就像我实际去看的那样,而不是“嗯,这种方法的工作原理类似于……”,如果我们在讨论理论而不是影响,我可能会这样做)。
public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
foreach (TSource current in source)
{
if (!predicate(current))
{
return false;
}
}
return true;
}
实施Any
根据ILSpy:
public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
foreach (TSource current in source)
{
if (predicate(current))
{
return true;
}
}
return false;
}
当然,产生的IL可能会有一些细微的差异。但是不,不,没有。IL几乎相同,但是明显的颠倒是谓词匹配返回true,而谓词不匹配返回false。
当然,这仅是针对对象的。某些其他linq提供程序可能会比另一种更好地对待它,但是如果是这种情况,哪个获得了最佳实现是非常随机的。
似乎规则完全归因于某人感觉if(determineSomethingTrue)
比if(!determineSomethingFalse)
。公平地说,我认为它们有一点意义,即if(!someTest)
当对相同的冗长性和复杂性进行另类测试时,对于我们要采取的条件返回真实值时,我常常会感到困惑*。但是,实际上,我个人没有发现哪一种可以比您提供的两种选择中的另一种更好,并且如果谓词更复杂,则可能会略微倾向于前者。
*不要因为我不明白而感到困惑,但是因为担心我不明白的决定有一些微妙的原因而使我感到困惑,并且需要花些时间跳过才能意识到“不,他们只是决定做这样,等我又在看这段代码吗?...”