Впровадження 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 майже однаковий, але для очевидної інверсії повернення істини на предикатну відповідність проти повернення false в невідповідності присудка.
Це звичайно лише linq-for-objects. Цілком можливо, що якийсь інший постачальник linq ставиться до одного набагато краще, ніж до іншого, але тоді, якщо це було так, то це майже випадково, який з них отримав більш оптимальну реалізацію.
Здавалося б, правило зводиться виключно до того, хто відчуває себе if(determineSomethingTrue)
простіше і читабельніше, ніж if(!determineSomethingFalse)
. І чесно кажучи, я думаю, що вони мають певний сенс у тому, що я часто if(!someTest)
буваю заплутаним *, коли існує альтернативний тест на рівність багатослів’я та складності, який би повернув істину для того стану, на який ми хочемо діяти. І справді, я особисто не знаходжу нічого, що надає перевагу одній з двох альтернатив, які ви даєте, і, можливо, дуже трохи схиляється до першої, якби предикат був складнішим.
* Не заплутаний, як в «Я не розумію», але заплутаний, як і я переживаю, що є якась тонка причина для рішення, яке я не розумію, і потрібно кілька розумових пропусків, щоб зрозуміти, що «ні, вони просто вирішили зробити так, чекайте, що я знову дивився на цей шматочок коду? ... "