根据ILSpy实现All
(就像我实际go 看的那样,而不是"好吧,这个方法有点像……"如果我们讨论的是理论,而不是影响,我可能会这么做).
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;
}
根据ILSpy实施Any
:
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仅适用于对象.有可能其他linq提供者对其中一个的处理比另一个好得多,但如果是这样的话,那么哪一个得到了更好的实现几乎是随机的.
这条规则似乎完全取决于那些觉得if(determineSomethingTrue)
比if(!determineSomethingFalse)
更简单、可读性更强的人.公平地说,我认为他们有一点道理,因为我经常发现if(!someTest)
令人困惑,当有另一种同样冗长和复杂的测试时,对于我们想要采取行动的条件,它会返回TRUE.然而,实际上,我个人认为,在您给出的两个 Select 中,没有什么比另一个更有利的,如果谓词更复杂,我可能会非常稍微倾向于前者.
*不是像我不理解那样令人困惑,而是像在我担心做出这个决定有一些我不理解的微妙原因,需要几次心理 skip 才能意识到"不,他们只是决定那样做,等等,我再看一遍这段代码是为了什么?"