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 #
| Tipe | Signature contoh | Return | Cocok untuk |
|---|---|---|---|
Func<T, TResult> | Func<string, int> | ada | menghitung, mengubah data |
Action<T> | Action<string> | tidak ada | mencetak, mencatat, memicu efek samping |
Predicate<T> | Predicate<string> | bool | menguji 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 #
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:
* Teh hijau (9 huruf)
* Kopi robusta (12 huruf)
* Gula aren (9 huruf)Bedah Kode Baris per Baris #
Mari kita telaah kode di atas:
- Baris 3:
panjangbertipeFunc<string, int>karena lambda mengembalikan nilai hitungan. - Baris 4:
cetakbertipeAction<string>karena lambda hanya mencetak tanpa mengembalikan apa pun. Body-nya memanggilpanjang, menunjukkan delegate dapat saling memakai. - Baris 5:
duaKatabertipePredicate<string>karena lambda menguji satu syarat bernilaibool. - Baris 7-12: Loop menyaring dengan
duaKata, lalu mencetak dengancetak. Ketiga item lolos karena semuanya terdiri dari dua kata;Kopi robustapaling 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.