Implementação de All
acordo com o ILSpy (como na verdade eu fui e olhei, em vez do "bem, esse método funciona um pouco como ..." eu poderia fazer se estivéssemos discutindo a teoria e não o 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;
}
Implementação de Any
acordo com 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;
}
Obviamente, pode haver alguma diferença sutil na IL produzida. Mas não, não, não há. O IL é praticamente o mesmo, mas pela inversão óbvia de retornar true na correspondência de predicado versus retornar falso na incompatibilidade de predicado.
Isso é linq-for-objects, é claro. É possível que algum outro provedor de linq trate um muito melhor que o outro, mas se esse for o caso, é bem aleatório qual deles obteve a implementação mais ideal.
Parece que a regra se resume apenas a alguém que se sente if(determineSomethingTrue)
mais simples e mais legível do que if(!determineSomethingFalse)
. E, para ser sincero, acho que eles têm um certo ponto em que muitas vezes acho if(!someTest)
confuso * quando há um teste alternativo de igual verbosidade e complexidade que retornaria verdadeiro para a condição em que queremos agir. No entanto, realmente, pessoalmente, não encontro nada a favor de uma das outras alternativas que você oferece, e talvez se inclinasse levemente em relação à primeira se o predicado fosse mais complicado.
* Não é confuso como em Eu não entendo, mas confuso como em Eu me preocupo que haja alguma razão sutil para a decisão que eu não entendo, e são necessários alguns saltos mentais para perceber que "não, eles apenas decidiram fazer dessa forma, espere o que eu estava olhando para este pedaço de código novamente? ... "