2014-03-24 4 views

Antwort

27

Sie können Enumerable.Any verwenden, es wird die Bedingung beim ersten Treffer erfüllen. Wie Habib richtigerweise besser gesagt hat, Any als Enumerable zu verwenden.Alle würden für eine Empty-Liste von Bool true zurückkehren.

!lst.Any(c=> c == true); 

OR verwenden Enumerable.All

lst.All(c=> c == false); 
+3

+1, Besser zu 'Any' zu verwenden, da' Enumerable.All' würde 'true' für eine leere Liste von bool zurückgeben. – Habib

+0

+1 Dies ist besser als All(), weil es immer die ganze Liste iteriert; es stoppt, wenn es einen findet –

+1

@AdrianCarneiro Uhm ..? Das ergibt keinen Sinn für mich. Beide sind faul und müssen in diesem Fall die gleiche Anzahl von Elementen betrachten. – user2864740

2

können Sie LINQ'sAll Methode verwenden:

Dies wird false sofort zurück, wenn sie einen Wert findet, der zu true entspricht.

4

ich mit der Verwendung von IEnumerable.Any/All zustimmen. Allerdings stimme ich nicht mit der derzeit am meisten gewählten Antwort (die zum Zeitpunkt der Erstellung dieses Textes falsch war) und einigen der damit verbundenen Kommentare von Any vs All überein.

Diese folgenden Operationen sind äquivalent semantisch. Beachten Sie, dass die Negationen sowohl innerhalb, auf das Prädikat und auf das Ergebnis der Operation angewendet werden.

!l.Any(x => f(x)) 
l.All(x => !f(x)) 

Nun, in diesem Fall wir also suchen:

Wenn es nicht der Fall ist, dass es irgendein wahrer Wert.

!l.Any(x => x) // f(x) = x == true 

Oder,

Es ist der Fall, dass jeder Wert nicht wahr.

l.All(x => !x) // f'(x) = !f(x) = !(x == true) 

Es gibt nichts für leere Listen Sonder ist das Ergebnis ist das gleiche: z.B. !empty.Any(..) ist falsch, ebenso wie empty.All(..) und die obige Äquivalenzbeziehung bleibt gültig.

Zusätzlich beide Formulare sind faul ausgewertet und erfordern die gleiche Anzahl von Auswertungen in ; intern negiert die Differenz für eine Sequenzimplementierung lediglich die Überprüfung des Prädikats und des Ergebniswertes.

Verwandte Themen