Chcę zobaczyć różnicę między metodami takewhile i where LINQ. Otrzymałem następujące dane z MSDN, ale to nie miało dla mnie sensu
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Filtruje sekwencję wartości na podstawie predykatu.
TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Zwraca elementy z sekwencji, o ile określony warunek jest prawdziwy.
Mile widziane wszystkie opinie.
Odpowiedzi:
TakeWhile zatrzymuje się, gdy warunek jest fałszywy, Where kontynuuje i znajduje wszystkie elementy pasujące do warunku
Daje
źródło
Where
może zbadać całą sekwencję w poszukiwaniu dopasowań.TakeWhile
przestaje szukać, gdy napotka pierwszy niedopasowanie.źródło
Powiedzmy, że masz tablicę, która zawiera
[1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
. Teraz:var whereTest = array.Where(i => i <= 5);
powróci[1, 3, 5, 0, 2, 4]
.var whileTest = array.TakeWhile(i => i <= 5);
powróci[1, 3, 5]
.źródło
MSDN mówi
Enumerable.TakeWhile Method
Enumerable.Where
Różnica polega na tym, że
Enumerable.TakeWhile
pomija pozostałe elementy z pierwszego niedopasowania, niezależnie od tego, czy spełniają warunek, czy nieźródło
Chociaż istniejące odpowiedzi są poprawne, żadna z nich nie wskazuje, dlaczego chcesz użyć TakeWhile, jeśli wyniki byłyby takie same: Wydajność. Załóżmy, że masz uporządkowaną listę z 2 miliardami pozycji i chcesz mieć te, które (prawdopodobnie 10 lub 15 pozycji) są mniejsze niż podana wartość. Klauzula Where zbada wszystkie 2 miliardy elementów, a TakeWhile zatrzyma się, gdy tylko znajdzie wartość równą lub większą niż podana wartość
źródło
Kolejność przekazanej sekwencji jest absolutnie krytyczna przy użyciu
TakeWhile
, która zakończy się, gdy tylko predykat powrócifalse
, podczas gdyWhere
będzie nadal oceniać sekwencję poza pierwsząfalse
wartością.Typowe użycie for
TakeWhile
jest podczas leniwego oceniania dużych, drogich lub nawet nieskończonych wyliczeń, gdzie możesz mieć dodatkową wiedzę na temat kolejności sekwencji.np. Biorąc pod uwagę sekwencję:
A
.Where
spowoduje nieskończoną pętlę próbującą oszacować część wyliczalnej:Natomiast a
.TakeWhile
, uzbrojony w wiedzę, że wyliczenia rosną, pozwoli ocenić sekwencję częściową:źródło