Saya ingin mendapatkan perbedaan antara metode takewhile & where LINQ. Saya mendapatkan data berikut dari MSDN. Tapi itu tidak masuk akal bagi saya
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Memfilter urutan nilai berdasarkan predikat.
TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
Mengembalikan elemen dari urutan selama kondisi yang ditentukan benar.
Semua pendapat disambut baik.
Jawaban:
TakeWhile berhenti ketika kondisinya salah, Di mana berlanjut dan menemukan semua elemen yang cocok dengan kondisi tersebut
Memberi
sumber
Where
dapat memeriksa seluruh urutan untuk mencari kecocokan.TakeWhile
berhenti melihat ketika bertemu dengan non-pertandingan pertama.sumber
Katakanlah Anda memiliki array yang berisi
[1, 3, 5, 7, 9, 0, 2, 4, 6, 8]
. Sekarang:var whereTest = array.Where(i => i <= 5);
akan kembali[1, 3, 5, 0, 2, 4]
.var whileTest = array.TakeWhile(i => i <= 5);
akan kembali[1, 3, 5]
.sumber
MSDN mengatakan
Enumerable.TakeWhile Method
Enumerable.Where
Perbedaannya adalah
Enumerable.TakeWhile
melewatkan elemen yang tersisa dari non-pertandingan pertama apakah mereka cocok dengan kondisi atau tidaksumber
Meskipun jawaban yang ada benar, tidak ada yang menunjukkan mengapa Anda ingin menggunakan TakeWhile jika hasilnya sama: Performa. Misalkan Anda memiliki daftar pesanan dengan 2 miliar item di dalamnya, dan Anda menginginkan daftar yang (mungkin 10 atau 15 item) kurang dari nilai tertentu. Klausul Where akan memeriksa semua 2 miliar item, sementara TakeWhile akan berhenti segera setelah menemukan nilai yang sama atau lebih besar dari nilai yang Anda berikan
sumber
Urutan urutan yang dilewati sangat penting dengan
TakeWhile
, yang akan berakhir segera setelah predikat kembalifalse
, sedangkanWhere
akan terus mengevaluasi urutan di luar nilai pertamafalse
.Penggunaan umum untuk
TakeWhile
adalah selama evaluasi malas dari enumerable besar, mahal, atau bahkan tak terbatas di mana Anda mungkin memiliki pengetahuan tambahan tentang pengurutan urutan.misalnya Diberikan urutannya:
A
.Where
akan menghasilkan pengulangan tak terbatas yang mencoba mengevaluasi bagian dari enumerable:Sedangkan a
.TakeWhile
, dan berbekal pengetahuan bahwa enumerables sedang menanjak, akan memungkinkan untuk mengevaluasi urutan parsial:sumber