Menggunakan LINQ pada koleksi, apa perbedaan antara baris kode berikut?
if(!coll.Any(i => i.Value))
dan
if(!coll.Exists(i => i.Value))
Perbarui 1
Ketika saya membongkar .Exists
sepertinya tidak ada kode.
Perbarui 2
Adakah yang tahu mengapa tidak ada kode untuk kode ini?
c#
linq
collections
Anthony D
sumber
sumber
Jawaban:
Lihat dokumentasi
List.Exists (Metode objek - MSDN)
Ini ada sejak .NET 2.0, jadi sebelum LINQ. Dimaksudkan untuk digunakan dengan delegasi Predikat , tetapi ekspresi lambda kompatibel ke belakang. Juga, hanya Daftar yang memiliki ini (bahkan bukan IList)
IEnumerable.Any (Metode ekstensi - MSDN)
Ini baru dalam. NET 3.5 dan menggunakan Func (TSource, bool) sebagai argumen, jadi ini dimaksudkan untuk digunakan dengan ekspresi lambda dan LINQ.
Dalam perilaku, ini identik.
sumber
List<>
metode contoh .NET 2 .Perbedaannya adalah bahwa Any adalah metode ekstensi untuk semua yang
IEnumerable<T>
didefinisikan pada System.Linq.Enumerable. Itu dapat digunakan padaIEnumerable<T>
contoh apa saja .Tampaknya tidak ada metode ekstensi. Dugaan saya adalah coll adalah tipe
List<T>
. If so Exists adalah metode instance yang fungsinya sangat mirip dengan Any.Singkatnya , metode dasarnya sama. Yang satu lebih umum daripada yang lain.
sumber
TLDR; Kinerja-bijaksana
Any
tampaknya lebih lambat (jika saya sudah mengatur ini dengan benar untuk mengevaluasi kedua nilai pada waktu yang hampir bersamaan)daftar pengujian generator:
Dengan catatan 10 juta
Dengan catatan 5 juta
Dengan catatan 1 juta
Dengan 500k, (Saya juga membalik urutan agar mereka dievaluasi untuk melihat apakah tidak ada operasi tambahan yang terkait dengan mana yang berjalan terlebih dahulu.)
Dengan catatan 100 ribu
Tampaknya
Any
akan lebih lambat dengan besarnya 2.Sunting: Untuk catatan 5 dan 10M saya mengubah cara menghasilkan daftar dan
Exists
tiba - tiba menjadi lebih lambat daripadaAny
yang menyiratkan ada sesuatu yang salah dalam cara saya menguji.Mekanisme pengujian baru:
Sunting2: Ok jadi untuk menghilangkan pengaruh dari menghasilkan data uji, saya menulis semuanya ke file dan sekarang membacanya dari sana.
10 jt
5 jt
1 jt
500rb
sumber
Sebagai kelanjutan dari jawaban Matas pada benchmarking.
TL / DR : Ada () dan Any () sama-sama cepat.
Pertama: Pembandingan menggunakan Stopwatch tidak tepat ( lihat jawaban series0ne pada topik yang berbeda namun serupa ), tetapi jauh lebih tepat daripada DateTime.
Cara untuk mendapatkan pembacaan yang sangat tepat adalah dengan menggunakan Performance Profiling. Tapi salah satu cara untuk mendapatkan rasa bagaimana kinerja dua metode mengukur sampai satu sama yaitu lain dengan menjalankan kedua metode beban kali dan kemudian membandingkan waktu eksekusi tercepat masing-masing. Dengan begitu, benar-benar tidak masalah bahwa JITing dan kebisingan lainnya memberi kita bacaan yang buruk (dan memang demikian ), karena kedua eksekusi itu " sama-sama menyesatkan " dalam arti tertentu.
Setelah mengeksekusi kode di atas 4 kali (yang pada gilirannya menghasilkan 1 000
Exists()
danAny()
pada daftar dengan 1 000 elemen), tidak sulit untuk melihat bahwa metode ini cukup cepat.Ada adalah sedikit perbedaan, tetapi perbedaan terlalu kecil untuk tidak dijelaskan oleh kebisingan latar belakang. Dugaan saya adalah bahwa jika seseorang melakukan 10.000 atau 100.000
Exists()
danAny()
sebagai gantinya, sedikit perbedaan akan hilang lebih atau kurang.sumber
Selain itu, ini hanya akan berfungsi jika Nilai adalah tipe bool. Biasanya ini digunakan dengan predikat. Predikat apa pun biasanya digunakan untuk mencari apakah ada unsur yang memenuhi syarat tertentu. Di sini Anda hanya melakukan peta dari elemen i ke properti bool. Ini akan mencari "i" yang nilai properti-nya benar. Setelah selesai, metode ini akan mengembalikan true.
sumber
Ketika Anda memperbaiki pengukuran - seperti yang disebutkan di atas: Apa saja dan Ada, dan menambahkan rata-rata - kami akan mendapatkan hasil sebagai berikut:
sumber