Implementazione di All
secondo ILSpy (come in realtà sono andato e guardato, piuttosto che "bene, quel metodo funziona un po 'come ..." Potrei fare se discutessimo della teoria piuttosto che dell'impatto).
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;
}
Attuazione Any
secondo 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;
}
Naturalmente, potrebbe esserci qualche sottile differenza nell'IL prodotta. Ma no, no non c'è. L'IL è praticamente lo stesso, ma per l'ovvia inversione di restituire true su match predicato rispetto a restituire false su predication mismatch.
Ovviamente questo è linq-per-oggetti. È possibile che alcuni altri provider linq trattino uno molto meglio dell'altro, ma se così fosse, è praticamente casuale quale ottenga l'implementazione più ottimale.
Sembrerebbe che la regola scenda solo a qualcuno che if(determineSomethingTrue)
si sente più semplice e più leggibile di if(!determineSomethingFalse)
. E in tutta onestà, penso che abbiano un po 'di senso nel fatto che trovo spesso if(!someTest)
confuso * quando c'è un test alternativo di uguaglianza e complessità uguali che tornerebbe vero per la condizione su cui vogliamo agire. Eppure, personalmente non trovo nulla che favorisca l'una rispetto all'altra delle due alternative che dai, e forse mi spingerei leggermente verso la prima se il predicato fosse più complicato.
* Non confuso come in non capisco, ma confuso come in temo che ci sia qualche sottile motivo per la decisione che non capisco, e ci vogliono alcuni salti mentali per rendersi conto che "no, hanno appena deciso di fare in quel modo, aspetta di nuovo cosa stavo guardando questo codice? ... "