Frage Erklärung von Func


Ich habe mich gefragt, ob jemand was erklären könnte Func<int, string> ist und wie es mit einigen klaren Beispielen verwendet wird.


76
2018-05-18 16:47


Ursprung


Antworten:


Kennen Sie die Delegierten im Allgemeinen? Ich habe eine Seite über Delegierte und Veranstaltungen Das kann helfen, wenn nicht, obwohl es eher darauf ausgerichtet ist, die Unterschiede zwischen den beiden zu erklären.

Func<T, TResult> ist nur ein generischer Delegierter - erarbeiten Sie, was es in einer bestimmten Situation bedeutet, indem Sie das ersetzen Typ Parameter (T und TResult) mit dem entsprechenden Argumente eingeben (int und string) in der Erklärung. Ich habe es auch umbenannt, um Verwirrung zu vermeiden:

string ExpandedFunc(int x)

Mit anderen Worten, Func<int, string> ist ein Delegat, der eine Funktion darstellt, die ein int Argument und Rückgabe eines string.

Func<T, TResult> wird oft in LINQ verwendet, sowohl für Projektionen als auch für Prädikate (im letzteren Fall TResult ist immer bool). Zum Beispiel könnten Sie a Func<int, string> um eine Folge von ganzen Zahlen in eine Folge von Strings zu projizieren. Lambda-Ausdrücke werden normalerweise in LINQ verwendet, um die relevanten Delegierten zu erstellen:

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

Ergebnis:

Value=3
Value=7
Value=10

125
2018-05-18 16:53



EIN Func<int, string> isst Ints und gibt Saiten zurück. Also, was isst Ints und gibt Saiten zurück? Wie wäre es damit ...

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

Dort habe ich gerade eine Funktion erfunden, die Ints verzehrt und Strings zurückgibt. Wie würde ich es benutzen?

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"

Nicht sehr sexy, ich weiß, aber das ist die einfache Idee, auf der viele Tricks basieren. Verwenden wir stattdessen einen Func.

Func<int, string> fnc = IntAsString;

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

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

Anstatt IntAsString für jedes Member aufzurufen, habe ich einen Verweis darauf erstellt, der fnc heißt (diese Referenzen auf Methoden werden aufgerufen) Delegierte) und stattdessen verwendet. (Denken Sie daran, dass FNC Its isst und Strings zurückgibt).

Dieses Beispiel ist nicht sehr sexy, aber eine Menge der cleveren Sachen, die Sie sehen werden, basiert auf der einfachen Idee von Funktionen, Delegierten und Erweiterungsmethoden.

Einer der besten Primer auf diesem Zeug, das ich gesehen habe, ist Hier. Er hat viel mehr reale Beispiele. :)


36
2018-05-18 17:18



Es ist ein Delegierter, der einen nimmt int als Parameter und gibt einen Wert vom Typ zurück string.

Hier ist ein Beispiel für seine Verwendung:

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> akzeptiert einen int value-Parameter und gibt einen string-Wert zurück. Hier ist ein Beispiel, wo eine zusätzliche unterstützende Methode unnötig ist.

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

HINWEIS: Der letzte Objekttyp in Func (d. H. "Zeichenfolge" in diesem Beispiel) ist der Funktionsrückgabetyp (d. H. Nicht auf Primitive beschränkt, sondern auf ein beliebiges Objekt). Deshalb, Func<int, bool, float> akzeptiert die Parameter int und bool value und gibt einen float-Wert zurück.

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