Implementación de All
acuerdo con ILSpy (como en realidad fui y miré, en lugar del "bueno, ese método funciona un poco como ..." podría hacerlo si estuviéramos discutiendo la teoría en lugar del impacto).
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;
}
Implementación de Any
acuerdo a 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;
}
Por supuesto, podría haber alguna diferencia sutil en la IL producida. Pero no, no, no lo hay. La IL es más o menos la misma, pero para la inversión obvia de devolver verdadero en la coincidencia de predicados versus devolver falso en la falta de coincidencia de predicados.
Esto es linq para objetos solo, por supuesto. Es posible que algún otro proveedor de linq trate a uno mucho mejor que el otro, pero si ese fuera el caso, es bastante aleatorio cuál obtuvo la implementación más óptima.
Parece que la regla se reduce únicamente a alguien que siente que if(determineSomethingTrue)
es más simple y más legible que if(!determineSomethingFalse)
. Y para ser justos, creo que tienen un cierto punto en que a menudo me parece if(!someTest)
confuso * cuando hay una prueba alternativa de igual verbosidad y complejidad que volvería a ser cierta para la condición sobre la que queremos actuar. Sin embargo, en realidad, personalmente no encuentro nada que favorezca una sobre la otra de las dos alternativas que ofrece, y tal vez me inclinaría ligeramente hacia la primera si el predicado fuera más complicado.
* No es confuso ya que no entiendo, pero confuso como me preocupa que haya alguna razón sutil para la decisión que no entiendo, y se necesitan algunos saltos mentales para darse cuenta de que "no, simplemente decidieron hacerlo de esa manera, espera ¿para qué estaba mirando este bit de código otra vez? ... "