Pertanyaan Penjelasan Func


Saya bertanya-tanya apakah seseorang bisa menjelaskan apa Func<int, string> dan bagaimana ia digunakan dengan beberapa contoh yang jelas.


76
2018-05-18 16:47


asal


Jawaban:


Apakah Anda akrab dengan delegasi secara umum? Saya memiliki halaman tentang delegasi dan acara yang mungkin membantu jika tidak, meskipun lebih diarahkan untuk menjelaskan perbedaan antara keduanya.

Func<T, TResult> hanyalah sebuah delegasi generik - cari tahu apa artinya dalam situasi tertentu dengan mengganti ketik parameter (T dan TResult) dengan yang sesuai ketik argumen (int dan string) dalam deklarasi. Saya juga menamainya untuk menghindari kebingungan:

string ExpandedFunc(int x)

Dengan kata lain, Func<int, string> adalah delegasi yang mewakili fungsi mengambil int argumen dan kembali a string.

Func<T, TResult> sering digunakan dalam LINQ, baik untuk proyeksi dan predikat (dalam kasus terakhir, TResult selalu bool). Misalnya, Anda bisa menggunakan Func<int, string> memproyeksikan urutan bilangan bulat ke dalam rangkaian 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

125
2018-05-18 16:53



SEBUAH Func<int, string> makan ints dan mengembalikan string. Jadi, apa yang makan int dan mengembalikan string? Bagaimana dengan ini ...

public string IntAsString( int i )
{
  return i.ToString();
}

Di sana, saya hanya membuat fungsi yang makan 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 itu ide sederhana yang banyak didasarkan pada 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 ke itu disebut fnc (referensi ke metode ini disebut delegasi) dan menggunakannya sebagai gantinya. (Ingat fnc makan ints dan mengembalikan string).

Contoh ini tidak terlalu seksi, tetapi satu ton hal pintar yang akan Anda lihat didasarkan pada ide sederhana fungsi, delegasi, dan metode penyuluhan.

Salah satu yang terbaik dalam hal ini yang pernah saya lihat adalah sini. Dia punya banyak contoh nyata. :)


36
2018-05-18 17:18



Itu adalah delegasi yang mengambil satu int sebagai parameter dan mengembalikan nilai jenis string.

Berikut ini 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();
    }
}

24
2018-05-18 16:48



Func<int, string> menerima parameter nilai int dan mengembalikan nilai string. Berikut ini 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 di Func (yaitu "string" dalam contoh ini) adalah fungsi tipe kembalian (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


0
2017-07-24 17:08