Penjelasan Func

89

Saya bertanya-tanya apakah seseorang dapat menjelaskan apa Func<int, string>itu dan bagaimana penggunaannya dengan beberapa contoh yang jelas.

zSinopsis
sumber

Jawaban:

145

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 ( Tdan TResult) dengan argumen tipe yang sesuai ( intdan 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 intargumen dan mengembalikan a string.

Func<T, TResult>sering digunakan di LINQ, baik untuk proyeksi maupun predikat (dalam kasus terakhir, TResultselalu 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
Jon Skeet
sumber
3
"Dengan kata lain, ini adalah delegasi yang mewakili sebuah fungsi yang mengambil argumen int dan mengembalikan sebuah string." Hanya untuk menghindari kebingungan bagi orang lain, saya akan menjelaskan bahwa Anda berbicara tentang Func <int, string> di sini dan bukan Func <T, TResult>. Jelas jika Anda memahami tipe generik dan delegasi tetapi bagi mereka yang tidak, Func <int, string> yang kan mendelegasikan ke fungsi yang mengambil argumen int dan mengembalikan string.
Napster asli
Akan menjelaskan saat saya kembali ke PC nanti.
Jon Skeet
2
Saya rasa ini sebenarnya tidak sejelas deskripsi dan contoh MSDN. Saya juga berpikir Anda harus menambahkan informasi tentang bagaimana param tipe terakhir adalah tipe kembalian - mengklarifikasi bahwa Func <int, int, string> mengembalikan string dan mengambil 2 int. Itu membantu memperjelas. Tidak ada yang bersifat pribadi - Saya hanya merasa tidak cukup jelas.
TheSoftwareJedi
11
Jadi, apakah Anda akan merendahkan setiap jawaban yang Anda anggap tidak membantu seperti favorit Anda? Apakah jawaban ini secara aktif tidak membantu , menurut Anda? Menurut Anda, apakah memiliki lebih dari satu cara memandang sesuatu bukanlah ide yang buruk?
Jon Skeet
8
@TheSoftwareJedi: Tidak, tentu saja, tidak ada alasan untuk menganggap downvote Anda secara pribadi - fakta bahwa Anda melakukan downvote karena alasan pribadi pada hari Sabtu dan kemudian kebetulan masuk ke utas ini setelah kami berdiskusi panjang di email tentang perilaku yang sesuai adalah sepenuhnya kebetulan, bukan?
Jon Skeet
40

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. :)

JP Alioto
sumber
@Therealnapster saya suka juga tapi saya lebih suka nama Anda.
BKSpurgeon
28

Ini adalah delegasi yang mengambil satu intsebagai 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();
    }
}
Andrew Hare
sumber
3
Terima kasih andrew. Apakah Anda bermaksud menulis func (1) alih-alih bar (1)?
zSynopsis
1

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

jts
sumber