Tiga tipe delegate generik ini telah kita pakai di hampir setiap bab section ini. Bab ini merangkum ketiganya sebagai tabel referensi, lalu memakai ketiganya sekaligus pada satu alur keranjang belanja. Setelah bab ini, memilih tipe delegate untuk lambda menjadi keputusan mekanis, bukan tebak-tebakan.

Seluruh lambda di section ini sejauh ini ditugaskan ke salah satu dari tiga tipe berikut, sehingga tabel di bawah lebih merupakan rangkuman pemetaan daripada materi baru. Yang sering belum diketahui adalah relasi Predicate<T> dengan Func<T, bool>, beserta pilihan tim di baliknya.

Tabel Referensi #

TipeSignature contohReturnCocok untuk
Func<T, TResult>Func<string, int>adamenghitung, mengubah data
Action<T>Action<string>tidak adamencetak, mencatat, memicu efek samping
Predicate<T>Predicate<string>boolmenguji syarat satu item

Predicate<T> setara dengan Func<T, bool>; keduanya dapat saling menggantikan secara konsep, meskipun kompiler memperlakukannya sebagai dua tipe berbeda.

Ketiganya Bekerja Bersama #

csharp
List<string> keranjang = new() { "Teh hijau", "Kopi robusta", "Gula aren" };

Func<string, int> panjang = item => item.Length;
Action<string> cetak = item => Console.WriteLine($"* {item} ({panjang(item)} huruf)");
Predicate<string> duaKata = item => item.Contains(' ');

foreach (string item in keranjang)
{
    if (duaKata(item))
    {
        cetak(item);
    }
}

Output yang Dihasilkan:

text
* Teh hijau (9 huruf)
* Kopi robusta (12 huruf)
* Gula aren (9 huruf)

Bedah Kode Baris per Baris #

Mari kita telaah kode di atas:

  1. Baris 3: panjang bertipe Func<string, int> karena lambda mengembalikan nilai hitungan.
  2. Baris 4: cetak bertipe Action<string> karena lambda hanya mencetak tanpa mengembalikan apa pun. Body-nya memanggil panjang, menunjukkan delegate dapat saling memakai.
  3. Baris 5: duaKata bertipe Predicate<string> karena lambda menguji satu syarat bernilai bool.
  4. Baris 7-12: Loop menyaring dengan duaKata, lalu mencetak dengan cetak. Ketiga item lolos karena semuanya terdiri dari dua kata; Kopi robusta paling panjang dengan 12 huruf.

Ketiga lambda berbagi satu argumen string, tetapi return type-lah yang membedakan peran. Ketika sebuah syarat dipakai lintas modul, Predicate<T> yang bernama jelas lebih mudah ditemukan daripada Func<T, bool> yang tersebar di banyak file.