Wdrożenie All
zgodnie z ILSpy (jak w rzeczywistości poszedłem i spojrzałem, zamiast „dobrze, ta metoda działa trochę jak ...” Mogę to zrobić, jeśli omawiamy teorię, a nie wpływ).
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;
}
Implementacja Any
zgodnie z 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;
}
Oczywiście może występować niewielka różnica w wytwarzanej IL. Ale nie, nie, nie ma. IL jest prawie taka sama, ale dla oczywistej inwersji zwracania wartości true w przypadku dopasowania predykatu w porównaniu do zwracania wartości false w przypadku niedopasowania predykatu.
Oczywiście jest to tylko linq dla obiektów. Możliwe, że jakiś inny dostawca linq traktuje jednego znacznie lepiej od drugiego, ale jeśli tak było, to raczej losowe, który otrzymał bardziej optymalną implementację.
Wydaje się, że reguła sprowadza się wyłącznie do tego, że ktoś czuje, że if(determineSomethingTrue)
jest prostszy i bardziej czytelny niż if(!determineSomethingFalse)
. I szczerze mówiąc, myślę, że mają one trochę racji w tym, że często mylę się if(!someTest)
*, gdy istnieje alternatywny test o równej gadatliwości i złożoności, który zwróciłby prawdę w przypadku warunku, na którym chcemy działać. Ale tak naprawdę, osobiście nie znajduję nic, co by sprzyjało jednej z dwóch alternatyw, które dajesz, i być może pochyliłbym się bardzo nieznacznie do pierwszej, gdyby orzeczenie było bardziej skomplikowane.
* Nie mylące jak w nie rozumiem, ale mylące jak w martwię się, że istnieje jakiś subtelny powód decyzji, której nie rozumiem, i kilka mentalnych przeskoków zdaje sobie sprawę, że „nie, po prostu postanowili to zrobić w ten sposób, poczekaj, po co znów patrzyłem na ten fragment kodu? ... "