Implémentation de All
selon ILSpy (comme en fait je suis allé voir, plutôt que "bien, cette méthode fonctionne un peu comme ..." Je pourrais le faire si nous discutions de la théorie plutôt que de l'impact).
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;
}
Implémentation de Any
selon 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;
}
Bien sûr, il pourrait y avoir une différence subtile dans l'IL produit. Mais non, non. L'IL est à peu près le même, mais pour l'inversion évidente du retour de true sur la correspondance de prédicat contre le retour de false sur la non-correspondance de prédicat.
Il s'agit bien sûr de linq-for-objects. Il est possible qu'un autre fournisseur linq en traite un bien mieux que l'autre, mais si tel était le cas, il est à peu près aléatoire lequel a obtenu la mise en œuvre la plus optimale.
Il semblerait que la règle se résume uniquement à quelqu'un qui if(determineSomethingTrue)
se sent plus simple et plus lisible que if(!determineSomethingFalse)
. Et en toute honnêteté, je pense qu'ils ont un petit point en ce que je trouve souvent if(!someTest)
déroutant * quand il existe un autre test de verbosité et de complexité égales qui reviendrait vrai pour la condition sur laquelle nous voulons agir. Pourtant, vraiment, je ne trouve personnellement rien à privilégier l'une par rapport à l'autre des deux alternatives que vous donnez, et je pencherais peut-être très légèrement vers la première si le prédicat était plus compliqué.
* Pas déroutant comme dans Je ne comprends pas, mais déroutant comme dans Je m'inquiète qu'il y ait une raison subtile pour la décision que je ne comprends pas, et il faut quelques sauts mentaux pour réaliser que "non, ils ont juste décidé de faire de cette façon, attendez à quoi je cherchais encore ce bout de code? ... "