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