Hier ist eine Erweiterung, die das tun kann, was OP tun wollte:
static bool All<T>(this IEnumerable<T> source, Func<T, bool> predicate, bool mustExist)
{
foreach (var e in source)
{
if (!predicate(e))
return false;
mustExist = false;
}
return !mustExist;
}
...und wie andere bereits gesagt haben, ist dies kein Fehler, sondern ein gut dokumentiertes, beabsichtigtes Verhalten.
Eine alternative Lösung, wenn man keine neue Erweiterung schreiben möchte, ist:
strs.DefaultIfEmpty().All(str => str == "ABC");
PS: Das obige funktioniert nicht, wenn man nach dem Standardwert selbst sucht! (Was bei Strings null wäre.) In solchen Fällen wird es weniger elegant mit etwas ähnlichem wie:
strs.DefaultIfEmpty(string.Empty).All(str => str == null);
Wenn Sie mehr als einmal aufzählen können, ist die einfachste Lösung:
strs.All(predicate) && strs.Any();
d.h. einfach eine Prüfung hinzufügen, ob es tatsächlich eine jede Element.