Adakah yang bisa menjelaskan bagaimana fungsi LINQ Dimana (..) dan FindAll (..) berbeda? Mereka berdua sepertinya melakukan hal yang sama ...
Adakah yang bisa menjelaskan bagaimana fungsi LINQ Dimana (..) dan FindAll (..) berbeda? Mereka berdua sepertinya melakukan hal yang sama ...
Jawaban:
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 FindAll
hanya dapat digunakan pada List<T>
instance (atau instance kelas yang mewarisi darinya, tentu saja).
Selain itu, mereka berbeda dalam tujuan sebenarnya. Where
mengembalikan contoh IEnumerable
yang dieksekusi sesuai permintaan ketika objek disebutkan. FindAll
mengembalikan baru List<T>
yang berisi elemen yang diminta. FindAll
lebih seperti memanggil Where(...).ToList()
contoh IEnumerable
.
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.
Jika saya ingat dengan benar, perbedaan utama (selain apa yang diimplementasikan pada: IEnumerable<T>
vs. List<T>
) adalah Where
mengimplementasikan eksekusi yang ditangguhkan, di mana ia tidak benar-benar melakukan pencarian sampai Anda membutuhkannya - menggunakannya dalam foreach loop misalnya. FindAll
adalah metode eksekusi langsung.
Saya melakukan beberapa tes pada daftar objek 80K dan menemukan bahwa Find()
bisa sampai 1000% lebih cepat daripada menggunakan Where
with 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.