Domanda

Mi chiedevo se qualcuno potesse spiegare che cosa Func<int, string> è e come viene utilizzato con alcuni esempi chiari.

È stato utile?

Soluzione

Sei familiarità con i delegati in generale? Ho una pagina su i delegati e gli eventi che possono aiutare in caso contrario, anche se è più orientato verso spiegando le differenze tra i due.

Func<T, TResult> è solo un delegato generico - capire cosa vuol dire in ogni situazione particolare sostituendo il parametri di tipo (T e TResult) con i corrispondenti argomenti di tipo (int e string) nella dichiarazione. Ho anche rinominato per evitare confusione:

string ExpandedFunc(int x)

In altre parole, Func<int, string> è un delegato che rappresenta una funzione prendendo un argomento int e restituendo un string.

Func<T, TResult> è spesso usato in LINQ, sia per proiezioni e predicati (in quest'ultimo caso, è sempre TResult bool). Ad esempio, è possibile utilizzare un Func<int, string> per proiettare una sequenza di interi in una sequenza di stringhe. Le espressioni lambda sono di solito utilizzati in LINQ per creare i delegati rilevanti:

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);
}

Risultato:

Value=3
Value=7
Value=10

Altri suggerimenti

Un Func<int, string> mangia interi e restituisce le stringhe. Allora, che cosa mangia ints e restituisce le stringhe? Che ne dite di questo ...

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

Ci, ho appena fatto una funzione che mangia interi e restituisce le stringhe. Come potrei usarlo?

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"

Non molto sexy, lo so, ma questa è la semplice idea che un sacco di trucchi si basano su. Ora, usiamo un Func invece.

Func<int, string> fnc = IntAsString;

foreach (int i in lst)
{
  str += fnc(i);
}

// str will be "1234512345" assuming we have same str as before

Invece di chiamare IntAsString in ogni membro, ho creato un riferimento ad essa chiamato FNC (questi riferimenti ai metodi vengono chiamati delegati ) e utilizzati che invece. (Ricordate fnc mangia ints e restituisce le stringhe).

Questo esempio non è molto sexy, ma un sacco di roba intelligente si vedrà si basa sulla semplice idea di funzioni, delegati e i metodi di estensione .

Una delle migliori primer su questa roba che ho visto è qui . Ha molto di più esempi reali. :)

Si tratta di un delegato che prende una int come parametro e restituisce un valore di tipo string.

Ecco un esempio del suo utilizzo:

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> accetta un parametro di valore int e restituisce un valore stringa. Ecco un esempio in cui un metodo di supporto supplementare è necessaria.

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);

NOTA: L'ultimo tipo oggetto Func (cioè "stringa" in questo esempio) è la funzione di tipo (cioè non limitate alle primitive, ma qualsiasi oggetto) ritorno. Pertanto, Func<int, bool, float> accetta parametri int e il valore bool, e restituisce un valore 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top