Saya menemukan diri saya menulis banyak kode seperti ini untuk memilih satu item yang cocok
var item = (from x in Items where x.Id == 123 select x).First();
Apakah ada cara yang lebih bersih untuk melakukannya atau apakah ini sesingkat yang akan saya dapatkan?
EDIT: Seharusnya mengatakan "Cara bersih menggunakan sintaks linq". Saya sudah mengetahui sintaks lambda dan mulai terlihat seperti ini sebenarnya satu-satunya cara. Saya memang mendapatkan beberapa info berguna, jadi terima kasih kepada semua orang yang menjawab.
Single()
danSingleOrDefault()
JIKA saya tahu datanya sudah unik (misalnya dari database yang memiliki kendala itu, dll), karenaSingle()
memaksanya untuk memindai sisa daftar untuk menemukan kemungkinan duplikat, tapi itu saya. Jika Anda perlu menegakkan keunikan Anda saat ini, gunakanSingle()
keluarga, jika tidak, gunakanFirst()
keluarga.Jawaban:
Tergantung seberapa Anda menyukai sintaks kueri linq, Anda dapat menggunakan metode ekstensi secara langsung seperti:
Dan jika Anda tidak ingin memunculkan kesalahan jika daftarnya kosong, gunakan
FirstOrDefault
yang mengembalikan nilai default untuk tipe elemen (null
untuk tipe referensi):Single()
danSingleOrDefault()
juga dapat digunakan, tetapi jika Anda membaca dari database atau sesuatu yang sudah menjamin keunikan, saya tidak akan repot-repot karena harus memindai daftar untuk melihat apakah ada duplikat dan lemparan.First()
danFirstOrDefault()
berhenti di pertandingan pertama, jadi mereka lebih efisien.Dari keluarga
First()
danSingle()
, inilah tempat mereka melempar:First()
- melempar jika kosong / tidak ditemukan, tidak melempar jika duplikatFirstOrDefault()
- mengembalikan default jika kosong / tidak ditemukan, tidak membuang jika duplikatSingle()
- melempar jika kosong / tidak ditemukan, melempar jika ada duplikatSingleOrDefault()
- mengembalikan default jika kosong / tidak ditemukan, melempar jika ada duplikatsumber
i.Id == 123
FirstOrDefault atau SingleOrDefault mungkin berguna, bergantung pada skenario Anda, dan apakah Anda ingin menangani jika tidak ada atau lebih dari satu kecocokan:
Saya tidak tahu bagaimana ini bekerja dalam kueri 'dari' linq tetapi dalam sintaks lambda terlihat seperti ini:
sumber
Ini adalah metode yang disukai:
Atau
sumber
Hanya untuk membuat hidup seseorang lebih mudah, kueri LINQ dengan ekspresi lambda
tidak menghasilkan kueri SQL dengan a
select top (1)
di dalamnya.sumber
Itu lebih baik diringkas menjadi ini.
var item = Items.First(x => x.Id == 123);
Permintaan Anda saat ini sedang mengumpulkan semua hasil (dan mungkin ada lebih dari satu) dalam enumerable dan kemudian mengambil yang pertama dari yang ditetapkan, melakukan lebih banyak pekerjaan dari yang diperlukan.
Single / SingleOrDefault bermanfaat, tetapi hanya jika Anda ingin mengulangi seluruh koleksi dan memverifikasi bahwa kecocokan itu unik selain memilih kecocokan itu. First / FirstOrDefault hanya akan mengambil pertandingan pertama dan pergi, terlepas dari berapa banyak duplikat yang sebenarnya ada.
sumber
Anda dapat menggunakan sintaks metode ekstensi:
Selain itu, saya tidak yakin seberapa ringkas Anda bisa mendapatkan, tanpa mungkin menulis metode ekstensi khusus "Pertama" dan "FirstOrDefault" Anda sendiri.
sumber
Where
sebagai lawanSelect
, yang telah dinyatakan, tetapi jawaban ini salah. Pilih di c # mengubah hasil ke IEnumerable <bool>, jadi Anda mendapatkan abool
untuk item pertamax.Id == 123
Saya akan memberi tahu Anda apa yang berhasil untuk saya:
ID saya adalah baris yang ingin saya kueri, dalam hal ini saya mendapatkannya dari radGrid, lalu saya menggunakannya untuk kueri, tetapi kueri ini mengembalikan satu baris, lalu Anda dapat menetapkan nilai yang Anda dapatkan dari kueri ke kotak teks, atau apa pun , Saya harus menetapkannya ke kotak teks.
sumber