Mencari jika ada nilai dalam daftar objek menggunakan Linq


228

Katakanlah saya memiliki kelas Customeryang memiliki properti FirstName. Lalu aku punya List<Customer>.

Dapatkah LINQ digunakan untuk mengetahui apakah daftar tersebut memiliki pelanggan dengan Firstname = 'John'satu pernyataan .. bagaimana?

Jawaban:


459

LINQ mendefinisikan metode ekstensi yang sempurna untuk menyelesaikan masalah ini:

using System.Linq;
...
    bool has = list.Any(cus => cus.FirstName == "John");

pastikan Anda merujuk System.Core.dll, di situlah LINQ tinggal.


24
Adakah yang baik, saya ingin tahu berapa banyak pengembang yang menggunakan Hitung ketika mereka harus menggunakan?
— RichardOD

12
Anda juga dapat melakukan pencarian case-sensitive: cus => cus.FirstName.Equals ("John", StringComparison.CurrentCultureIgnoreCase)
— jmservera

1
Saya tahu ini adalah pertanyaan lama tetapi mengapa kita tidak menggunakan metode yang ada? Melihat seperti itu dibuat untuk melihat apakah ada sesuatu.
— Blackunknown

6
Karena tidak semua koleksi memiliki Ada, dan itu tidak mengambil ekspresi lambda, melainkan objek yang kita cari sendiri.
— zvolkov

1
@ zvolkov, Gagasan mengapa penyelamat saya menyarankan agar saya menggunakan bool has = list.All (cus => cus.FirstName! = "John"); Apakah ini lebih optimal?
— Gullu

105

Jawaban zvolkov adalah jawaban yang tepat untuk mencari tahu apakah ada pelanggan seperti itu. Jika Anda perlu menggunakan pelanggan setelah itu, Anda dapat melakukan:

Customer customer = list.FirstOrDefault(cus => cus.FirstName == "John");
if (customer != null)
{
    // Use customer
}

Saya tahu ini bukan yang Anda tanyakan, tetapi saya pikir saya akan menjawab pertanyaan lanjutan :) (Tentu saja, ini hanya menemukan pelanggan pertama ... untuk menemukan semuanya, gunakan saja whereklausa normal .)


7
Saya akan menunjukkan bahwa Anda mungkin menghargai telah melakukan ini nanti ketika datang untuk debugging, jika Anda tiba-tiba penasaran dengan pelanggan mana yang sesuai dengan kriteria.
— mqp

1
Hanya menambah satu jawaban ini karena saya suka cara komunitas SO melakukan langkah ekstra untuk menambahkan lebih banyak lagi pada pertanyaan / jawaban.
— barneymc

1
terima kasih itu membantu saya, tetapi kadang-kadang saya hanya ingin mendapatkan boolhasil, jadi dalam hal ini .Anyatau .FindIndexdigunakan di sini yang cepat ?
— shaijut

1
@stom: Mereka berdua O (N), pada dasarnya ... mereka hanya pencarian linear.
— Jon Skeet

menabrak ini. Saya suka cara Anda menggunakan sintaks list.FirstOrDefault alih-alih melakukan list.Where (). FirstOrDefault.
— GunWanderer

25

Satu opsi untuk pertanyaan tindak lanjut (bagaimana menemukan pelanggan yang mungkin memiliki sejumlah nama depan):

List<string> names = new List<string>{ "John", "Max", "Pete" };
bool has = customers.Any(cus => names.Contains(cus.FirstName));

atau untuk mengambil pelanggan dari csv dari daftar serupa

string input = "John,Max,Pete";
List<string> names = input.Split(',').ToList();
customer = customers.FirstOrDefault(cus => names.Contains(cus.FirstName));

10

Menggunakan Linq Anda memiliki banyak kemungkinan, berikut ini tanpa menggunakan lambdas:

//assuming list is a List<Customer> or something queryable...
var hasJohn = (from customer in list
         where customer.FirstName == "John"
         select customer).Any();

5
customerList.Any(x=>x.Firstname == "John")

Ini tidak menjawab pertanyaan "jika" entri seperti itu ada; itu hanya menyebutkan nilai-nilai jika ada. Diperlukan langkah ekstra untuk menentukan apakah enumerasi ini tidak kosong.
— jason

Kemudian ubah Where to Any. Mungkin lebih filosofis buat saya. Saya jarang perlu tahu jika tanpa peduli yang mana. @ jmservera: Anda benar. Saya menyerah LINQ beberapa waktu lalu dan sekarang menggunakan Lambda secara eksklusif.
— Chris Brandsma

Saya tidak bermaksud terlalu berlebihan ketika saya mengatakan bahwa menggunakan panggilan lambda secara teknis masih menggunakan LINQ. (Khususnya, Anda menggunakan LINQ-to-Objects.) Anda hanya menggunakan metode panggilan daripada kata kunci bahasa.
— Yehuda Gabriel Himango

Apa perbedaan jawaban ini dengan zvolkov?
— dotnetN00b

4

Teknik yang saya gunakan sebelum menemukan .Any():

var hasJohn = (from customer in list
      where customer.FirstName == "John"
      select customer).FirstOrDefault() != null;

3
List<Customer> list = ...;
Customer john = list.SingleOrDefault(customer => customer.Firstname == "John");

john akan menjadi nol jika tidak ada pelanggan dengan nama depan "John".


2
Itu akan menimbulkan pengecualian jika lebih dari satu pelanggan disebut John.
— Jon Skeet

1
Terima kasih atas komentarnya. Saya akan meninggalkan jawabannya sebagai contoh yang benar sebagian.
— M4N

Itu masih berlaku dalam skenario ketika Anda yakin ada 1 dan Anda ingin pengecualian yang muncul jika lebih dari satu, jadi saya pikir itu baik bahwa Anda tidak menghapusnya.
— RichardOD

1

Kemungkinan lain

if (list.Count(customer => customer.Firstname == "John") > 0) {
 //bla
}

4
Lebih baik menggunakan Any dalam skenario ini.
— RichardOD

1

Coba ini, saya harap ini membantu Anda.

 if (lstCustumers.Any(cus => cus.Firstname == "John"))
 {
     //TODO CODE
 }

4
Itu sama dengan jawaban yang diterima dari lebih dari 8 tahun yang lalu. Pastikan jawaban Anda unik di antara semua jawaban.
— Tony_Henrich
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.