Saya suka string.IsNullOrEmpty
metode. Saya ingin memiliki sesuatu yang memungkinkan fungsi yang sama untuk IEnumerable. Apakah ada? Mungkin beberapa kelas penolong koleksi? Alasan saya bertanya adalah bahwa dalam if
pernyataan kode terlihat berantakan jika derai itu (mylist != null && mylist.Any())
. Akan jauh lebih bersih untuk dimiliki Foo.IsAny(myList)
.
Posting ini tidak memberikan jawaban itu: IEnumerable kosong? .
c#
.net
linq
collections
ienumerable
Schultz9999
sumber
sumber
Jawaban:
Tentu Anda bisa menulis itu:
Namun, berhati-hatilah agar tidak semua urutan dapat diulang; umumnya saya lebih suka hanya berjalan sekali, untuk berjaga-jaga.
sumber
this
sana - saya mempertimbangkan metode ekstensi yang dianggap dipanggilnull
sebagai tanda desain yang jelek..Any()
adalah metode ekstensi yang beroperasi padaIEnumerable<T>
(atauIQueryable<T>
, meskipun itu skenario yang berbeda). Melakukan hal itu menghabiskan urutan , setidaknya sebagian (meskipun itu masih berarti dikonsumsi) - mungkin hanya perlu membaca satu elemen (terutama jika tidak ada predikat). Karena itu, karena sekuens (IEnumerable<T>
) tidak perlu diulang, itu mungkin saja .Any()
tanpa predikat pada dasarnya setara denganforeach(var x in sequence) { return true; } return false;
- walaupun menggunakanGetEnumerator()
dll alih-alih sintaksis kompilersumber
IEnumerable
tidak memilikiAny()
ekstensi.Inilah versi modifikasi dari jawaban bermanfaat @Matt Greer yang menyertakan kelas pembungkus statis sehingga Anda bisa menyalinnya ke file sumber baru, tidak bergantung pada Linq, dan menambahkan generik
IEnumerable<T>
overload , untuk menghindari tinju tipe nilai itu akan terjadi dengan versi non-generik. [EDIT: Perhatikan bahwa penggunaanIEnumerable<T>
tidak mencegah tinju pencacah, pengetikan bebek tidak dapat mencegah hal itu, tetapi setidaknya elemen dalam koleksi yang diketik nilai tidak masing-masing akan dikotakkan.]sumber
Cara lain adalah dengan mendapatkan Enumerator dan memanggil metode MoveNext () untuk melihat apakah ada item:
Ini berfungsi untuk IEnumerable dan juga IEnumerable <T>.
sumber
IEnumerable<T>
, karena non-generikIEnumerable
tidak diterapkanIDisposable
.Cara saya melakukannya, memanfaatkan beberapa fitur C # modern:
Pilihan 1)
Pilihan 2)
Dan omong-omong, jangan pernah gunakan
Count == 0
atauCount() == 0
hanya untuk memeriksa apakah koleksi kosong. Selalu gunakan Linq.Any()
sumber
!
, khususnya di opsi kedua;)Ini bisa membantu
sumber
Dimulai dengan C # 6 Anda dapat menggunakan propagasi nol :
myList?.Any() == true
Jika Anda masih menemukan ini terlalu tersumbat atau lebih suka metode ekstensi yang baik, saya akan merekomendasikan jawaban Matt Greer dan Marc Gravell, namun dengan sedikit fungsionalitas tambahan untuk kelengkapan.
Jawaban mereka menyediakan fungsionalitas dasar yang sama, tetapi masing-masing dari perspektif lain. Jawaban Matt menggunakan
string.IsNullOrEmpty
-mentality, sedangkan jawaban Marc mengambil.Any()
jalan Linq untuk menyelesaikan pekerjaan.Saya pribadi cenderung menggunakan
.Any()
jalan, tetapi ingin menambahkan fungsionalitas pengecekan kondisi dari kelebihan metode lainnya :Jadi Anda masih bisa melakukan hal-hal seperti:
myList.AnyNotNull(item=>item.AnswerToLife == 42);
seperti yang Anda bisa dengan reguler.Any()
tetapi dengan cek nol ditambahkanPerhatikan bahwa dengan cara C # 6:
myList?.Any()
mengembalikan abool?
daripada abool
, yang merupakan efek sebenarnya dari propagasi nolsumber
sumber
Berikut kode dari jawaban Marc Gravell , bersama dengan contoh menggunakannya.
Seperti yang dia katakan, tidak semua urutan dapat diulang, sehingga kode kadang-kadang dapat menyebabkan masalah, karena
IsAny()
mulai melangkah melalui urutan. Saya menduga apa maksud jawaban Robert Harvey adalah bahwa Anda sering tidak perlu memeriksanull
dan mengosongkan. Seringkali, Anda dapat memeriksa null dan kemudian menggunakannyaforeach
.Untuk menghindari memulai urutan dua kali dan memanfaatkan
foreach
, saya hanya menulis beberapa kode seperti ini:Saya kira metode ekstensi menghemat beberapa baris pengetikan, tetapi kode ini tampaknya lebih jelas bagi saya. Saya menduga bahwa beberapa pengembang tidak akan segera menyadari bahwa
IsAny(items)
sebenarnya akan mulai melangkah melalui urutan. (Tentu saja jika Anda menggunakan banyak urutan, Anda dengan cepat belajar untuk memikirkan langkah apa yang melaluinya.)sumber
Saya menggunakan
Bool IsCollectionNullOrEmpty = !(Collection?.Any()??false);
. Semoga ini membantu.Kerusakan:
Collection?.Any()
akan kembalinull
jika Koleksi adalah nol, danfalse
jika Koleksi kosong.Collection?.Any()??false
akan memberi kitafalse
jika Koleksi kosong, danfalse
jika Koleksi adalahnull
.Pelengkap itu akan memberi kita
IsEmptyOrNull
.sumber
Anwser Jon Skeet ( https://stackoverflow.com/a/28904021/8207463 ) memiliki pendekatan yang baik menggunakan Metode Extension - Any () untuk NULL dan KOSONG. TETAPI dia memvalidasi pemilik pertanyaan untuk TIDAK NULL. Jadi hati-hati ubah pendekatan Jon untuk memvalidasi AS NULL ke:
JANGAN gunakan (tidak akan divalidasi SEBAGAI NULL):
Anda juga dapat dalam kasus memvalidasi SEBAGAI TIDAK NULL (TIDAK diuji hanya sebagai contoh tetapi tanpa kesalahan kompiler) melakukan sesuatu seperti menggunakan predikat:
https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8788153112b7ffd0
Untuk versi .NET yang dapat Anda gunakan, periksa:
https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.any?view=netframework-4.8#moniker-applies-to
sumber
Saya memiliki masalah yang sama dan saya menyelesaikannya seperti:
"c => c! = null" akan mengabaikan semua entitas nol.
sumber
Saya membangun ini dari jawaban oleh @Matt Greer
Dia menjawab pertanyaan OP dengan sempurna.
Saya menginginkan sesuatu seperti ini sambil mempertahankan kemampuan asli Any sembari memeriksa nol. Saya memposting ini kalau-kalau ada yang membutuhkan sesuatu yang serupa.
Secara khusus saya ingin tetap bisa lulus dalam predikat.
Penamaan metode ekstensi mungkin bisa lebih baik.
sumber
Solusi terbaik lain seperti di bawah ini untuk mengecek kosong atau tidak?
sumber
listEnumerable
nol, yang merupakan pertanyaan yang adaSaya menggunakan ini:
Ejem:
sumber
Karena beberapa sumber daya habis setelah dibaca, saya pikir mengapa tidak menggabungkan cek dan bacaan, alih-alih cek terpisah tradisional, lalu membaca.
Pertama, kami memiliki satu untuk ekstensi inline nol-sederhana yang lebih sederhana:
Kemudian kita memiliki sedikit lebih banyak terlibat (well, setidaknya cara saya menulisnya) check-for-null-and-empty inline extension:
Anda tentu saja masih dapat memanggil keduanya tanpa melanjutkan rantai panggilan. Juga, saya menyertakan paramName, sehingga pemanggil dapat menyertakan nama alternatif untuk kesalahan jika tidak "sumber" diperiksa, misalnya "nameof (target)".
sumber
metode ekstensi saya sendiri untuk memeriksa Tidak null dan Apa pun
sumber
Tanpa pembantu kustom saya sarankan salah satu
?.Any() ?? false
atau?.Any() == true
yang relatif singkat dan hanya perlu menentukan urutannya sekali.Ketika saya ingin memperlakukan koleksi yang hilang seperti yang kosong, saya menggunakan metode ekstensi berikut:
Fungsi ini dapat dikombinasikan dengan semua metode LINQ dan
foreach
, bukan hanya.Any()
, itulah sebabnya saya lebih suka daripada fungsi pembantu yang lebih khusus yang diusulkan orang di sini.sumber
saya menggunakan
Hasilnya akan nol jika tidak cocok, jika tidak mengembalikan salah satu objek
Jika Anda menginginkan daftar tersebut, saya yakin meninggalkan First () atau memanggil ToList () akan memberikan daftar atau nol.
sumber
Lihatlah perpustakaan opensource ini: Nzr.ToolBox
sumber
cukup tambahkan
using System.Linq
dan lihat keajaiban yang terjadi ketika Anda mencoba mengakses metode yang tersedia diIEnumerable
. Menambahkan ini akan memberi Anda akses ke metode bernamaCount()
sesederhana itu. hanya ingat untuk memeriksanull value
sebelum meneleponcount()
:)sumber
Saya menggunakan sederhana jika untuk memeriksanya
lihat solusi saya
sumber