Ich möchte einen Unterschied zwischen der Dauer und den LINQ-Methoden machen. Ich habe die folgenden Daten von MSDN erhalten. Aber es hat für mich keinen Sinn ergeben
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Filtert eine Folge von Werten basierend auf einem Prädikat.
TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Gibt Elemente aus einer Sequenz zurück, solange eine bestimmte Bedingung erfüllt ist.
Alle Meinungen sind willkommen.
Antworten:
TakeWhile stoppt, wenn die Bedingung falsch ist. Where fährt fort und findet alle Elemente, die der Bedingung entsprechen
Gibt
quelle
Where
kann die gesamte Sequenz auf Übereinstimmungen untersuchen.TakeWhile
hört auf zu suchen, wenn es auf das erste Nicht-Match stößt.quelle
Angenommen, Sie haben ein Array, das enthält
[1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
. Jetzt:var whereTest = array.Where(i => i <= 5);
wird zurückkehren[1, 3, 5, 0, 2, 4]
.var whileTest = array.TakeWhile(i => i <= 5);
wird zurückkehren[1, 3, 5]
.quelle
MSDN sagt
Enumerable.TakeWhile Method
Enumerable.Where
Der Unterschied besteht darin, dass
Enumerable.TakeWhile
die verbleibenden Elemente aus der ersten Nichtübereinstimmung übersprungen werden, unabhängig davon, ob sie der Bedingung entsprechen oder nichtquelle
Obwohl die vorhandenen Antworten korrekt sind, weist keine darauf hin, warum Sie TakeWhile verwenden möchten, wenn die Ergebnisse dieselben wären: Leistung. Angenommen, Sie haben eine geordnete Liste mit 2 Milliarden Artikeln und möchten diejenigen, die (wahrscheinlich 10 oder 15 Artikel) weniger als einen bestimmten Wert haben. Die Where-Klausel prüft alle 2 Milliarden Elemente, während TakeWhile beendet wird, sobald ein Wert gefunden wird, der gleich oder größer als Ihr angegebener Wert ist
quelle
Die Reihenfolge der übergebenen Sequenz ist absolut kritisch mit
TakeWhile
, was endet, sobald ein Prädikat zurückkehrtfalse
, währendWhere
die Sequenz weiterhin über den erstenfalse
Wert hinaus ausgewertet wird.Eine häufige Verwendung für
TakeWhile
ist die verzögerte Auswertung großer, teurer oder sogar unendlicher Aufzählungen, bei denen Sie möglicherweise zusätzliche Kenntnisse über die Reihenfolge der Sequenz haben.zB Gegeben die Reihenfolge:
A
.Where
führt zu einer Endlosschleife, die versucht, einen Teil der Aufzählung auszuwerten:Während a
.TakeWhile
und mit dem Wissen, dass die Aufzählungen aufsteigend sind, die Bewertung der Teilsequenz ermöglicht:quelle