Mencari produk minuman yang harganya tidak melebihi anggaran tertentu adalah bentuk penyaringan data yang paling umum. Operator Where menjalankan tugas itu: setiap elemen diuji dengan predikat, dan hanya elemen yang lolos yang masuk hasil. Bab ini memakai daftar produk yang sama dengan dua bab sebelumnya.

Predikat sebagai Syarat Penyaringan #

Contoh berikut merangkai dua Where berturut-turut untuk menggabungkan dua syarat:

csharp
record Produk(string Nama, string Kategori, int Harga, int Stok);

List<Produk> produk = new()
{
    new Produk("Kopi Gayo", "Minuman", 25000, 40),
    new Produk("Teh Melati", "Minuman", 15000, 60),
    new Produk("Roti Bakar", "Makanan", 12000, 25),
    new Produk("Susu UHT", "Minuman", 20000, 35),
    new Produk("Keripik Singkong", "Makanan", 10000, 80)
};

var minumanTerjangkau = produk
    .Where(p => p.Kategori == "Minuman")
    .Where(p => p.Harga <= 20000);

foreach (var p in minumanTerjangkau)
{
    Console.WriteLine($"{p.Nama}: {p.Harga}");
}

Output yang Dihasilkan:

text
Teh Melati: 15000
Susu UHT: 20000

Mari kita bedah baris demi baris:

  1. .Where(p => p.Kategori == "Minuman"): predikat pertama menyaring kategori; elemen lain dilewati tanpa diubah.
  2. .Where(p => p.Harga <= 20000): predikat kedua bekerja hanya atas hasil penyaringan pertama.
  3. foreach: mencetak nama dan harga setiap elemen yang lolos kedua syarat.
  4. urutan hasil: Where menjaga urutan sumber, sehingga hasil muncul sesuai posisi aslinya.

Satu Predikat atau Dua Where #

Dua panggilan Where berurutan setara dengan satu Where berisi syarat gabungan p => p.Kategori == "Minuman" && p.Harga <= 20000. Memisahkannya menjadi dua langkah membuat maksud tiap syarat terbaca lebih jelas, sedangkan menggabungkannya lebih ringkas. Pilih bentuk yang paling mudah dibaca oleh pengelola kode setelah kita. Perhatikan pula tanda pembanding pada syarat numerik: p.Harga <= 20000 masih menerima tepat 20000, sedangkan p.Harga < 20000 menolaknya.

Where juga punya overload yang menyertakan indeks: produk.Where((p, indeks) => indeks < 3) mengambil tiga elemen pertama dengan menguji posisi elemen. Overload ini berguna untuk syarat yang bergantung pada letak elemen, bukan hanya isinya.

Sama seperti bab-bab sebelumnya, Where tidak menyalin data ke wadah baru; hasilnya adalah kueri yang membaca sumber pada saat diiterasi, perilaku yang dibedah tuntas pada bab Deferred Execution.