Implementacja All
według ILSpy (tak jak w rzeczywistości poszedłem i spojrzałem, zamiast "dobrze, ta metoda działa trochę jak ..." Mogłabym zrobić, gdybyśmy dyskutowali raczej o teorii niż o wpływie).
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;
}
Wykonanie Any
według 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, mogą pojawić się pewne nieznaczne różnice w IL produkowane. Ale nie, nie, nie ma. IL jest prawie taki sam, ale dla oczywistej inwersji zwracanej wartości true na dopasowaniu predykatów i zwracania wartości false w przypadku niezgodności predykatów.
Oczywiście tylko dla obiektów typu "linq-for-objects". Jest możliwe, że jakiś inny dostawca linq traktuje o wiele lepiej niż inny, ale jeśli tak było, to jest to dość losowe, które ma bardziej optymalną implementację.
Wydaje się, że reguła ta sprowadza się wyłącznie do kogoś, kto czuje, że if(determineSomethingTrue)
jest prostszy i bardziej czytelny niż if(!determineSomethingFalse)
. I w uczciwości, myślę, że mają one pewien punkt w tym, że często uważam, że jest to mylące *, gdy istnieje alternatywny test o równej szczegółowości i złożoności, który powróciłby do stanu, w którym chcemy działać. Ale tak naprawdę, ja osobiście nie znajduję niczego, co mogłoby faworyzować jedną z dwóch oferowanych przez ciebie alternatyw, i być może pochyliłbym się nieznacznie w kierunku pierwszego, gdyby orzeczenie było bardziej skomplikowane.
* Nie mylić, jak w nie rozumiem, ale mylące, ponieważ martwię się, że istnieje jakiś subtelny powód decyzji, której nie rozumiem, i potrzeba kilku mentalnych przeskoków, aby zrozumieć, że "nie, oni właśnie postanowił zrobić to w ten sposób, należy odczekać co ja patrząc na ten kawałek kodu na raz ...”
Czy próbowałeś rozmontować kod Linq, aby zobaczyć, co robi? – RQDQ
W tym przypadku chciałbym iść z if (! AcceptedValues.Contains (someValue)), ale oczywiście to nie było pytanie :) – csgero
@csgero Zgadzam się. Powyższe było uproszczeniem (być może nadmiernym uproszczeniem) prawdziwej logiki. – Mark