Wie kann ich mit Linq prüfen, ob eine Sammlung kein Objekt enthält? IE Das Gegenteil von Any<T>
.
Ich könnte das Ergebnis mit einem invertieren, !
aber aus Gründen der Lesbarkeit habe ich mich gefragt, ob es einen besseren Weg gibt, dies zu tun. Soll ich die Erweiterung selbst hinzufügen?
!
?Contains
,Exists
?None<T>
. Ich benutze oft solche benutzerdefinierten Erweiterungen für die Lesbarkeit (zum Beispiel mag ich die!dictionary.ContainsKey(key)
Syntax nicht, also habe ichdictionary.NoKey(key)
stattdessen implementiert .ConcurrentDictionary
, weil es die wirklich praktischeGetOrAdd
Methode ist, auch wenn ich keine Parallelität benötige.Antworten:
Sie können ganz einfach eine
None
Erweiterungsmethode erstellen :public static bool None<TSource>(this IEnumerable<TSource> source) { return !source.Any(); } public static bool None<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { return !source.Any(predicate); }
quelle
Das Gegenteil der Überprüfung, ob ein (mindestens ein) Datensatz einem bestimmten Kriterium entspricht, besteht darin, zu überprüfen, ob nicht alle Datensätze den Kriterien entsprechen.
Sie haben Ihr vollständiges Beispiel nicht veröffentlicht, aber wenn Sie das Gegenteil von etwas wie:
var isJohnFound = MyRecords.Any(x => x.FirstName == "John");
Du könntest benutzen:
var isJohnNotFound = MyRecords.All(x => x.FirstName != "John");
quelle
var isJohnNotFound = !MyRecords.All(x => x.FirstName == "John");
!MyRecords.All(x => InvalidNames.Any(n => n == x.Name));
so: Überprüfen Sie jeden Eintrag anhand einer Liste ungültiger Namen. Nur wenn keine Übereinstimmung vorliegt, ist das Ergebnis wahr.Wenn Sie die
Any()
Methode nicht umbrechen möchten, können Sie zusätzlich zu den hinzugefügten AntwortenNone()
Folgendes implementieren :public static bool None<TSource>(this IEnumerable<TSource> source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } using (IEnumerator<TSource> enumerator = source.GetEnumerator()) { return !enumerator.MoveNext(); } } public static bool None<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (predicate == null) { throw new ArgumentNullException(nameof(predicate)); } foreach (TSource item in source) { if (predicate(item)) { return false; } } return true; }
Zusätzlich können Sie für die parameterlose Überladung eine
ICollection<T>
Optimierung anwenden , die in der LINQ-Implementierung tatsächlich nicht vorhanden ist.ICollection<TSource> collection = source as ICollection<TSource>; if (collection != null) { return collection.Count == 0; }
quelle
Ich habe diesen Thread gefunden, als ich herausfinden wollte, ob eine Sammlung kein Objekt enthält, aber nicht überprüfen möchte, ob alle Objekte in einer Sammlung den angegebenen Kriterien entsprechen. Am Ende habe ich so einen Scheck gemacht:
var exists = modifiedCustomers.Any(x => x.Key == item.Key); if (!exists) { continue; }
quelle