Saya bertanya-tanya apakah seseorang dapat menjelaskan apa Func<int, string>
itu dan bagaimana penggunaannya dengan beberapa contoh yang jelas.
Jawaban:
Apakah Anda mengenal delegasi secara umum? Saya memiliki halaman tentang delegasi dan acara yang dapat membantu jika tidak, meskipun lebih diarahkan untuk menjelaskan perbedaan antara keduanya.
Func<T, TResult>
hanyalah sebuah delegasi umum - cari tahu apa artinya dalam situasi tertentu dengan mengganti parameter tipe ( T
dan TResult
) dengan argumen tipe yang sesuai ( int
dan string
) dalam deklarasi. Saya juga telah mengganti namanya untuk menghindari kebingungan:
string ExpandedFunc(int x)
Dengan kata lain, Func<int, string>
adalah delegasi yang mewakili fungsi yang mengambil int
argumen dan mengembalikan a string
.
Func<T, TResult>
sering digunakan di LINQ, baik untuk proyeksi maupun predikat (dalam kasus terakhir, TResult
selalu bool
). Misalnya, Anda dapat menggunakan a Func<int, string>
untuk memproyeksikan urutan bilangan bulat menjadi urutan string. Ekspresi lambda biasanya digunakan di LINQ untuk membuat delegasi yang relevan:
Func<int, string> projection = x => "Value=" + x;
int[] values = { 3, 7, 10 };
var strings = values.Select(projection);
foreach (string s in strings)
{
Console.WriteLine(s);
}
Hasil:
Value=3
Value=7
Value=10
A Func<int, string>
makan int dan mengembalikan string. Jadi, apa yang memakan int dan mengembalikan string? Bagaimana dengan ini ...
public string IntAsString( int i )
{
return i.ToString();
}
Di sana, saya baru saja membuat fungsi yang memakan int dan mengembalikan string. Bagaimana saya menggunakannya?
var lst = new List<int>() { 1, 2, 3, 4, 5 };
string str = String.Empty;
foreach( int i in lst )
{
str += IntAsString(i);
}
// str will be "12345"
Tidak terlalu seksi, saya tahu, tapi itulah ide sederhana yang mendasari banyak trik. Sekarang, mari gunakan Func sebagai gantinya.
Func<int, string> fnc = IntAsString;
foreach (int i in lst)
{
str += fnc(i);
}
// str will be "1234512345" assuming we have same str as before
Alih-alih memanggil IntAsString pada setiap anggota, saya membuat referensi untuk itu disebut fnc (referensi ke metode ini disebut delegasi ) dan menggunakannya sebagai gantinya. (Ingat fnc memakan int dan mengembalikan string).
Contoh ini tidak terlalu seksi, tetapi banyak hal pintar yang akan Anda lihat didasarkan pada gagasan sederhana tentang fungsi, delegasi, dan metode ekstensi .
Salah satu primer terbaik untuk hal ini yang pernah saya lihat ada di sini . Dia punya lebih banyak contoh nyata. :)
Ini adalah delegasi yang mengambil satu int
sebagai parameter dan mengembalikan nilai tipe string
.
Berikut contoh penggunaannya:
using System;
class Program
{
static void Main()
{
Func<Int32, String> func = bar;
// now I have a delegate which
// I can invoke or pass to other
// methods.
func(1);
}
static String bar(Int32 value)
{
return value.ToString();
}
}
Func<int, string>
menerima parameter nilai int dan mengembalikan nilai string. Berikut adalah contoh di mana metode pendukung tambahan tidak diperlukan.
Func<int, string> GetDogMessage = dogAge =>
{
if (dogAge < 3) return "You have a puppy!";
if (dogAge < 7) return "Strong adult dog!";
return "Age is catching up with the dog!";
};
string youngDogMessage = GetDogMessage(2);
CATATAN: Jenis objek terakhir dalam Func (yaitu "string" dalam contoh ini) adalah jenis fungsi yang dikembalikan (yaitu tidak terbatas pada primitif, tetapi objek apa pun). Karena itu,Func<int, bool, float>
menerima parameter nilai int dan bool, dan mengembalikan nilai float.
Func<int, bool, float> WorthlessFunc = (intValue, boolValue) =>
{
if(intValue > 100 && boolValue) return 100;
return 1;
};
float willReturn1 = WorthlessFunc(21, false);
float willReturn100 = WorthlessFunc(1000, true);
HTH