Implementacja All
pokazuje bardzo wyraźnie, dlaczego.
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 element in source) {
if (!predicate(element)) return false;
}
return true;
}
To prowadzi foreach
nad kolekcji. Jeśli w kolekcji nie ma elementów, pominie się wartość foreach
i zwróci wartość true.
Co ciekawe, realizacja na Any
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 element in source) {
if (predicate(element)) return true;
}
return false;
}
Cleary ten pokazuje, że są przeciwieństwami.
Wydaje mi się logiczne. _Wszystkie liczby w 'arr' są większe od zera (co oznacza, że jest _no_ liczba _nie większa niż zero), a liczba _no_ w' arr' jest większa od zera. –
W obu dokumentach wyraźnie stwierdzono, że są to oczekiwane wyniki dla pustych sekwencji. – juharr
@juharr Wydaje mi się, że pytanie dotyczy raczej tego, dlaczego tak zostało zaimplementowane (co oczywiście można wyjaśnić logiką boolowską). –