Wenn ich Aktionen wie .Where (...) oder .Max (...) ausführen möchte, muss ich sicherstellen, dass die Liste nicht null ist und eine Zählung größer als Null hat. Außerdem mache ich jedes Mal etwas wie das Folgende, wenn ich die Liste verwenden möchte:
%Vor%Gibt es etwas mehr Inline- oder Lambda-ähnliche Technik, die ich benutzen kann? Oder eine andere komprimierte Technik?
Meine allgemeine Präferenz besteht darin, leere Listeninstanzen anstelle von Nulllistenvariablen zu haben. Jedoch kann nicht jeder seine Mitarbeiter in diese Anordnung schmeicheln. Mit dieser Erweiterungsmethode können Sie sich vor Nulllistenvariablen schützen.
%Vor%Aufruf von:
%Vor% Die meisten linq-Methoden arbeiten mit leeren Sammlungen. Zwei Methoden, die nicht sind, sind Min und Max. Im Allgemeinen rufe ich diese Methoden gegen ein IGrouping auf. Die meisten IGroup-Implementierungen haben mindestens ein Element (z. B. IGroupings, die von GroupBy
oder ToLookup
generiert wurden). In anderen Fällen können Sie Enumerable.DefaultIfEmpty
verwenden.
Lassen Sie die Liste nicht leer sein
Stellen Sie sicher, dass sich das Objekt immer in einem gültigen Zustand befindet. Indem Sie sicherstellen, dass die Liste niemals null ist, müssen Sie nie überprüfen, dass die Liste null ist.
%Vor% Auch wenn diese Liste leer ist, erhalten Sie immer noch eine gültige IEnumerable<int>
zurück.
Max- und Min-Überladungen mit Nullwerttypen
Das löst aber immer noch nicht die Probleme "Max" und "Min". Es gibt eine Überladung von Max und Min, die Selektoren verwenden. Diese Selektor-Überladungen können NULL-fähige Ints zurückgeben, so dass Ihre Max-Methode folgendermaßen lautet:
%Vor%Daher führen Sie Max aus und prüfen, ob Sie einen Nullwert oder eine Ganzzahl zurückbekommen haben. voila!
Weitere Optionen
Benutzerdefinierte Erweiterungsmethoden
Sie könnten auch Ihre eigenen Erweiterungsmethoden schreiben.
%Vor%Überschreiben von Linq-Erweiterungsmethoden
Und schließlich denken Sie daran, dass die Linq-Erweiterungsmethoden mit eigenen Erweiterungsmethoden mit übereinstimmenden Signaturen überschrieben werden können. Daher könnten Sie eine Erweiterungsmethode zum Ersetzen von .Where (...) und .Max (...) schreiben, um null (oder einen Standardwert) zurückzugeben, anstatt eine ArgumentNullException auszulösen, wenn Enumerable null ist.
Verwenden Sie empty
Sammlungen anstelle von null
Sammlungen. Where
funktioniert gut gegen eine leere Sammlung, so dass Sie Count > 0
nicht vor dem Aufruf sicherstellen müssen. Du kannst Max
auch für eine leere Sammlung aufrufen, wenn du zuerst ein Gymnastikstück machst.
Für IEnumerable<T>
verwenden Sie Enumerable.Empty<T>()
Für T[]
verwenden Sie new T[0]
Für List<T>
verwenden Sie new List<T>()
Wenn das Risiko besteht, dass Ihre Liste ungültig ist, müssen Sie dies immer überprüfen, bevor Sie eine ihrer Methoden aufrufen, aber Sie können die Methode Any () anstelle von count verwenden. Dies wird wahr, sobald es ein Element zählt, unabhängig davon, ob es ein oder mehrere Elemente in der Liste gibt. Dies spart das Iterieren über die gesamte Liste, was Count tun wird:
%Vor%Sie können verwenden ?? Operator, der null in den Wert konvertiert, den Sie auf der rechten Seite angeben:
%Vor%Übrigens: Es ist kein Problem, eine leere Liste mit LINQ zu verarbeiten.
Sie müssen Count
nicht überprüfen, um Where
aufzurufen. Max
benötigt eine nicht leere Liste für Werttypen, die aber mit einer Inline-Darstellung, zB
Tags und Links .net c# linq linq-to-objects