Gibt es das Gegenteil von LINQs All-Methode?

8

Ich verwende derzeit

%Vor%

was gut funktioniert, aber ich würde gerne wissen, ob es eine richtige LINQ-Methode gibt, um das Gegenteil von allem zu tun.

    
TankorSmash 20.01.2013, 06:22
quelle

4 Antworten

18

All () überprüft, ob ein gegebenes Prädikat für alle Elemente den Wert true zurückgibt. In Bezug auf die Framework-Entwicklung würde es keinen Sinn machen, eine separate Methode zu schreiben, die überprüft, dass ein gegebenes Prädikat für alle Items false zurückgibt, da es so einfach ist, ein Prädikat "nicht" zu machen. Sie können jedoch Ihre eigene Erweiterungsmethode schreiben:

%Vor%     
Eren Ersönmez 20.01.2013, 06:42
quelle
6

Das genaue Gegenteil von All() ist im Wesentlichen None , aber da LINQ keine Methode None() hat, können Sie das gleiche Ergebnis über !set.Any() erreichen.

%Vor%

Dies erzeugt true , wenn keines der Elemente in a_list einen matches -Wert hat, der nicht wahr ist.

Dieses doppelte Negativ ist etwas verwirrend, um ein einfacheres Beispiel zu geben:

%Vor%

ist wahr, wenn alle der Elemente in names mit R beginnen (wie Sie bereits wissen).

%Vor%

ist wahr, wenn keine der Elemente in names mit R beginnt.

Aufgrund Ihres Kommentars klingt es so, als würden Sie nur nach einer Möglichkeit suchen, dasselbe Ergebnis wie das aktuelle Code-Snippet zu erzielen, aber auf andere Weise. Dies sollte das gleiche Ergebnis liefern wie Ihr aktueller Code, aber ohne ! im Prädikat:

%Vor%

Dies kann weiter vereinfacht werden zu:

%Vor%

Ich könnte mir vorstellen, dass auch Ihre Version vereinfacht werden könnte:

%Vor%

Es gibt selten einen guten Grund, einen booleschen Wert explizit mit true oder false zu vergleichen.

    
JLRishe 20.01.2013 06:24
quelle
2

Du hast geschrieben:

%Vor%

Das ist wie:

%Vor%

Sie können auch .any () verwenden, um dasselbe Ergebnis zu erzielen:

%Vor%

Bei Leistungsproblemen: .any () vs .all () - beide hätten dieselbe Leistung (Wenn linq to object verwendet wird), finden Sie hier mehr: LINQ: Nicht alle gegen alle Nicht

    
yoav barnea 20.01.2013 08:16
quelle
1

Anstatt die Bedingung All () zu negieren, verwenden Sie einfach Any () mit demselben Prädikat und behandeln den zurückgegebenen Booleschen Wert entsprechend.

Also, anstatt:

%Vor%

Sie können

haben %Vor%

Beachten Sie die Änderung des Namens des Flags. (Natürlich übersehe ich semantische Dinge wie das ursprüngliche Prädikat könnte als item => item.field_is_true == false oder einfach item => !item.field_is_true geschrieben worden sein).

Wenn Sie den Namen des Flags beibehalten möchten, verwenden Sie Any (), aber negieren Sie ihn:

%Vor%     
slugster 20.01.2013 06:53
quelle

Tags und Links