Bessere Möglichkeit, nach Elementen in der Liste zu suchen?

8

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?

    
4thSpace 09.11.2011, 16:48
quelle

8 Antworten

3

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.

%Vor%     
Amy B 09.11.2011, 17:03
quelle
9
%Vor%

Sie können dann etwas wie

tun %Vor%     
Muhammad Hasan Khan 09.11.2011 16:53
quelle
2

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.

    
Christopher Harris 09.11.2011 16:52
quelle
2

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>()

    
Chris Shouts 09.11.2011 16:54
quelle
1

Sie könnten myList.Any() anstelle von .Count ausprobieren, aber Sie müssen immer noch nach null suchen.

    
Igor 09.11.2011 16:52
quelle
1

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%     
Andy Rose 09.11.2011 16:53
quelle
1

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.

    
Olivier Jacot-Descombes 09.11.2011 17:00
quelle
1

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

, überwunden werden kann %Vor%     
fearofawhackplanet 09.11.2011 17:00
quelle

Tags und Links