Implementierung von All
gemäß ILSpy (wie in Ich habe tatsächlich nachgesehen und nicht nach "Nun, diese Methode funktioniert ein bisschen wie ...", was ich tun könnte, wenn wir eher die Theorie als die Auswirkungen diskutieren würden).
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;
}
Implementierung von Any
nach 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;
}
Natürlich könnte es einen subtilen Unterschied in der produzierten IL geben. Aber nein, nein gibt es nicht. Die IL ist ziemlich gleich, aber für die offensichtliche Umkehrung der Rückgabe von true bei Prädikatübereinstimmung gegenüber der Rückgabe von false bei Prädikatfehlanpassung.
Dies ist natürlich nur Linq-for-Objects. Es ist möglich, dass ein anderer Linq-Anbieter einen viel besser behandelt als den anderen, aber wenn dies der Fall ist, ist es ziemlich zufällig, welcher die optimalere Implementierung erhalten hat.
Es scheint, dass die Regel nur auf jemanden zurückzuführen ist, der das Gefühl hat, if(determineSomethingTrue)
einfacher und lesbarer zu sein alsif(!determineSomethingFalse)
. Und fairerweise denke ich, dass sie einen gewissen Punkt haben, den ich oft if(!someTest)
verwirrend finde *, wenn es einen alternativen Test von gleicher Ausführlichkeit und Komplexität gibt, der für die Bedingung, auf die wir reagieren wollen, wahr ist. Ich persönlich finde jedoch nichts, was eine der beiden von Ihnen angegebenen Alternativen gegenüber der anderen bevorzugt, und würde mich vielleicht ganz leicht zu der ersteren neigen, wenn das Prädikat komplizierter wäre.
* Nicht verwirrend wie in Ich verstehe nicht, aber verwirrend wie in Ich mache mir Sorgen, dass es einen subtilen Grund für die Entscheidung gibt, den ich nicht verstehe, und es braucht ein paar mentale Sprünge, um zu erkennen, dass "Nein, sie haben sich einfach dazu entschlossen Warten Sie auf diese Weise, worauf habe ich diesen Code noch einmal angeschaut? ... "