Saya telah mendiskusikan hal ini dengan kolega, dan kami tidak tahu apa gunanya .Any
untuk setiap pemberian List<>
, di C #.
Anda dapat memeriksa validitas elemen dalam array seperti pernyataan berikut:
if (MyList.Any()){ ...} //Returns true or false
Yang persis sama dengan
if (MyList.Count() != 0) { ... }
dan jauh lebih umum, mudah dibaca dan jelas tentang maksud if
pernyataan itu.
Pada akhirnya, kami terjebak dengan pemikiran ini:
.Any()
dapat digunakan, akan bekerja dengan baik, tetapi kurang jelas tentang maksud programmer, dan jika itu tidak boleh digunakan.
Tetapi kami merasa ini tidak mungkin benar; kita pasti kehilangan sesuatu.
Apakah kita?
Any()
kurang jelas:Any()
tampak lebih jelas bagi saya, terutama dengan kondisi lambda. Menerjemahkan kode ke Bahasa Inggris di kepalaku,if(MyList.Count(o => o > 10) > 0)
menjadi "Apakah jumlah item lebih besar dari 10 lebih dari 0?" sedangkanif(MyList.Any(o => o > 10))
menjadi "Apakah ada item lebih besar dari 10?"Any
isExists
. Nama Linq mungkin lebih terinspirasi oleh Haskell dan Python yang juga memiliki fungsi apa saja.Jawaban:
Ingatlah bahwa
Any
itu tidak beroperasi padaList
; beroperasi padaIEnumerable
, yang mewakili tipe konkret yang mungkin atau mungkin tidak memilikiCount
properti. Memang benar bahwa itu belum tentu yang terbaik untuk digunakan padaList
, tapi itu pasti berguna di akhir permintaan LINQ. Dan yang lebih bermanfaat daripada versi standalone adalah override yang mengambil predikat sepertiWhere
. Tidak ada yang dibangun di atasList
yang dekat nyaman atau ekspresif sebagaiAny
metode perpanjangan predikat .Selain itu, jika Anda menggunakan
Count()
(metode ekstensi LINQ untuk IEnumerable), daripadaCount
(properti aktifList
), ia harus menghitung seluruh urutan jika tidak dapat mengoptimalkannya dengan mendeteksi bahwa tipe data mendasar Anda memilikiCount
Properti . Jika Anda memiliki urutan panjang, ini bisa menjadi hit kinerja yang nyata ketika Anda tidak benar-benar peduli tentang apa yang menghitung adalah, dan hanya ingin tahu apakah ada setiap item dalam koleksi.sumber
Any()
dengan predikat lebih ekspresif daripada membandingkan penimpaanEnumerable.Count()
yang mengambil predikat dengan 0. :)Exists
sama nyaman dan ekspresifnyaAny
, dengan predikat. MenggunakanCount != 0
properti pada aList
lebih normal daripada menggunakanAny()
. Itu hanya preferensi pribadi. Saya juga telah melalui upaya mengubah_list_.Count()
ke_list_.Count
dalam kode grup saya. Itu membuat perbedaan nyata bagi saya.Ada perbedaan run time
Count()
bisa O (n) di manaAny()
O (1)sumber
Count()
juga tidak akan berhenti untuk iterator yang tak terbatas, sementaraAny()
akan, karena hanya perlu memanggilMoveNext()
sekali.Any(Func<T>)
is O (n)List
, kinerja adalah sama karena ekstensi menggunakan properti. Benar untuk semua koleksi yang mengimplementasikanICollection
antarmuka.Sebenarnya, perlu diingat bahwa ada properti List.Count , dan kemudian ada metode Enumerable.Count .
Dalam contoh Anda, Anda menggunakan
Enumerable.Count()
metode ini, yang harus mengulangi setiap item enumerasi untuk mengembalikan hasil. Itu jelas lebih lambat daripada meneleponAny()
yang hanya perlu mengulang item pertama, jika ada.EDIT:
Dalam komentar itu ditunjukkan, memang benar, bahwa
Enumerable.Count()
metode ekstensi tidak perlu mengulangi semua item jika mendeteksi bahwa enumerable juga merupakanICollection<T>
. Jadi dalam kasus aList<T>
, menggunakanCount
properti atau metode sebenarnya tidak membuat perbedaan.Sumber IEnumerable.Count :
sumber
List<T>
perbedaan kinerja akan diabaikan. Jadi gunakan saja apa yang Anda inginkan. Tetapi untuk jenis IEnumerables lainnya, Anda hanya bisa memilih di antaraCount()
(metode), danAny()
, dan dalam hal itu,Any()
akan selalu menjadi pemenang yang jelas untuk kasus penggunaan Anda dan harus lebih disukai. Untuk apa nilainya, saya pikirAny()
cukup mudah dibaca dan jelas.Count()
memiliki kompleksitas yang sama denganCount
untukICollection
s, karena metode ekstensi kemudian menggunakan properti alih-alih iterasi.Sebuah pertanyaan yang mengejutkan - saya menemukan niat
list.Any()
untuk menjadi lebih jelas daripada niatlist.Count()!=0
.Maksud Maksud: Jika Anda membaca kode seseorang (dan Anda tidak menulisnya sendiri), apakah benar-benar jelas apa yang ingin dicapai oleh programmer dan mengapa itu ditulis tertulis seperti itu? Jika masalah umum diselesaikan dengan cara yang rumit dan tidak perlu, Anda segera menjadi curiga dan heran mengapa pengembang tidak menggunakan cara sederhana. Anda melihat-lihat kode dan mencoba melihat apakah Anda melewatkan sesuatu. Anda takut untuk mengubah kode karena Anda khawatir ada beberapa efek samping yang Anda lewatkan dan mengubahnya dapat menyebabkan masalah yang tidak terduga.
Maksud menggunakan
Any()
metode ini sepenuhnya jelas - Anda ingin tahu apakah ada elemen dalam daftar atau tidak.Maksud dari ungkapan
Count()!=0
di sisi lain tidak jelas bagi pembaca. Tentu saja tidak sulit untuk melihat bahwa ekspresi memberitahu Anda apakah daftar itu kosong atau tidak. Pertanyaan muncul karena Anda menulisnya dengan cara tertentu daripada menggunakan metode standar. Mengapa Anda menggunakanCount()
secara eksplisit? Jika Anda benar-benar hanya perlu tahu apakah ada setiap elemen dalam daftar, mengapa Anda ingin menghitung seluruh daftar pertama? Segera setelah Anda mencapai 1 Anda sudah memiliki jawaban. Jika sumbernya adalah iterator atas koleksi besar (mungkin tak terbatas) atau diterjemahkan ke sql, itu bisa membuat perbedaan besar dalam kinerja. Jadi mungkin penggunaan eksplisit Count () adalah untuk memaksa permintaan yang ditangguhkan untuk mengeksekusi atau melintasi iterator?Tetapi sumbernya sebenarnya adalah di
List<T>
manaCount()
O (1) dan tidak memiliki efek samping. Tetapi jika kode ini mengandalkan properti iniList<T>
, maka mengapa tidak menggunakanCount
-properti yang lebih jelas menunjukkan bahwa Anda mengharapkan operasi O (1) tanpa efek samping?Seperti yang tertulis,
list.Count()!=0
melakukan persis sama denganlist.Any()
kecuali itu tidak perlu lebih rumit dan maksudnya tidak jelas.sumber
Count()
memiliki konversi tersirat yang saya akan hindari menggunakan, tetapi tidak jelas. Kompiler dapat mengoptimalkannya, yang hanya membuatnya menjadi pengkodean yang ceroboh.Mungkin itu hanya kata?
Any
adalah kata sifat, tidak benar-benar mengatakan apa-apa. Berasal dari Jawa, saya akan menyebutnyaisNonEmpty
yang berisi kata kerja. Seorang pria SQL mungkin lebih sukaEXISTS
. Tapi mungkinAny
paling cocok di sistem C #.Apa pun pilihan kata, begitu Anda terbiasa, itu harus menjadi lebih jelas. Apakah Anda akan bertanya "Apakah masih ada
more than zero
botol bir". Apakah Anda berharapone or more
orang mulai menghitungnya sebelum mereka menjawab "Tidak, tidak adaany
"?sumber
Any()
benar-benar merupakan jalan pintas untukAny(o => true)