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-for-objectsだけです。他の一部のlinqプロバイダーが他のlinqプロバイダーをより適切に処理することは可能ですが、そうである場合、どちらがより最適な実装を得たかはかなりランダムです。
ルールif(determineSomethingTrue)
は、に比べてシンプルで読みやすいと感じている人にのみ適用されるようですif(!determineSomethingFalse)
。公平にif(!someTest)
言えば、私たちが行動したい条件に対してtrueを返す同等の冗長性と複雑さの代替テストがある場合、私はしばしば混乱*するという点で少しポイントがあると思います。しかし、実際には、私が個人的に、あなたが与える2つの選択肢のどちらかを優先することは何もないので、述語がより複雑である場合は、前者にわずかに傾くでしょう。
*私が理解していないように混乱しないが、私が理解していない決定にいくつかの微妙な理由があることを心配しているように混乱している。そうすれば、このコードをもう一度見て何を待っていたのか...」