LINQ, Dimana () vs FindAll ()

Jawaban:

203

FindAll()adalah fungsi pada List<T>tipe, ini bukan metode ekstensi LINQ seperti Where. Metode ekstensi LINQ berfungsi pada semua jenis yang diimplementasikan IEnumerable, sedangkan FindAllhanya dapat digunakan pada List<T>instance (atau instance kelas yang mewarisi darinya, tentu saja).

Selain itu, mereka berbeda dalam tujuan sebenarnya. Wheremengembalikan contoh IEnumerableyang dieksekusi sesuai permintaan ketika objek disebutkan. FindAllmengembalikan baru List<T>yang berisi elemen yang diminta. FindAlllebih seperti memanggil Where(...).ToList()contoh IEnumerable.

Adam Robinson
sumber
20
Ya, Di mana versi findall yang malas
Pierreten
2
code.msdn.microsoft.com/LINQ-Query-Execution-ce0d3b95 menjelaskan perbedaan antara lazy (deferred) dan eksekusi langsung. Pada dasarnya, dalam beberapa kasus, Anda tidak memerlukan keseluruhan daftar, Anda mungkin ingin mengulang item hingga terjadi sesuatu, lalu berhenti. Di sinilah lazy berguna, tetapi tergantung pada implementasinya, dapat menyebabkan hasil yang tidak dapat diprediksi (semua dijelaskan di tautan). Semoga ini membantu.
nurchi
10

Perbedaan terbesar bagi saya adalah .FindAll juga tersedia dalam .Net 2.0. Saya tidak selalu memiliki kemewahan untuk memprogram dalam .Net 3.5, jadi saya mencoba mengingat metode 'asli' dari koleksi generik .Net.

Itu terjadi beberapa kali ketika saya menerapkan metode Daftar yang sudah tersedia sendiri karena saya tidak dapat LINQ itu.

Apa yang saya temukan berguna dalam kasus ini adalah, dengan menggunakan VS2008, saya dapat menggunakan inferensi tipe dan sintaks lambda. Ini adalah fitur kompilator, bukan fitur kerangka kerja. Ini berarti saya dapat menulis ini dan masih tetap dalam .Net 2.0:

var myOddNums = myNums.FindAll(n => n%2==1);

Tetapi jika Anda memiliki LINQ yang tersedia, penting untuk menjaga perbedaan antara eksekusi yang ditangguhkan dan eksekusi segera.

cfern
sumber
6

Jika saya ingat dengan benar, perbedaan utama (selain apa yang diimplementasikan pada: IEnumerable<T>vs. List<T>) adalah Wheremengimplementasikan eksekusi yang ditangguhkan, di mana ia tidak benar-benar melakukan pencarian sampai Anda membutuhkannya - menggunakannya dalam foreach loop misalnya. FindAlladalah metode eksekusi langsung.

WayneC
sumber
3

Saya melakukan beberapa tes pada daftar objek 80K dan menemukan bahwa Find()bisa sampai 1000% lebih cepat daripada menggunakan Wherewith FirstOrDefault(). Saya tidak tahu itu sampai menguji pengatur waktu sebelum dan sesudah setiap panggilan. Kadang-kadang di waktu yang sama, di lain waktu lebih cepat.

digiben
sumber
5
Apakah Anda juga mencoba mengakses koleksi? Enumerable.Where () menggunakan eksekusi yang ditangguhkan dan tidak dievaluasi sebelum koleksi diakses, yang dapat menyebabkan konsepsi yang salah tentang apakah sebenarnya lebih cepat atau tidak. Namun, ini untuk sebagian besar, biasanya lebih cepat menggunakan enumerable daripada koleksi statis (seperti Type <T> dan Array <T>).
Sebastian Job Bjørnager Jensen
Pertanyaannya adalah tentang FindAll. Jelas Find akan lebih cepat daripada Where (mengambil semua nilai) dan mendapatkan FirstOrDefault
Vivek MVK