Реализация в All
соответствии с ILSpy (как я на самом деле пошел и посмотрел, а не «ну, этот метод работает немного как ...» я мог бы сделать, если бы мы обсуждали теорию, а не влияние).
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;
}
Реализация Any
согласно 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;
}
Конечно, может быть небольшая разница в произведенном IL. Но нет, нет, нет. IL в значительной степени такой же, но для очевидной инверсии возврата true при совпадении предикатов и возврата false при несовпадении предикатов.
Это, конечно, только linq-для-объектов. Возможно, что какой-то другой поставщик linq рассматривает одного из них гораздо лучше, чем другого, но тогда, если бы это было так, случайным образом, какой из них получил более оптимальную реализацию.
Казалось бы, правило сводится исключительно к тому, кто чувствует себя if(determineSomethingTrue)
проще и понятнее, чем if(!determineSomethingFalse)
. И, честно говоря, я думаю, что у них есть некоторая точка в том, что меня часто if(!someTest)
смущает *, когда есть альтернативный критерий равной многословности и сложности, который вернул бы значение true для условия, в котором мы хотим действовать. Тем не менее, на самом деле, я лично не нахожу ничего, чтобы отдавать предпочтение одной из двух альтернатив, которые вы предоставляете, и, возможно, очень немного склонялся бы к первой, если бы предикат был более сложным.
* Не сбивающий с толку, поскольку я не понимаю, но сбивающий с толку, поскольку я беспокоюсь, что есть некая тонкая причина для решения, которое я не понимаю, и требуется несколько умственных пропусков, чтобы понять, что «нет, они просто решили сделать так, подожди, что я снова посмотрел на этот кусочек кода? ... "