Frage

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

War es hilfreich?

Lösung

Sind Sie vertraut mit den Delegierten im Allgemeinen? Ich habe eine Seite über Delegierten und Veranstaltungen , die nicht helfen können, wenn, obwohl es mehr Getriebe ist in Richtung Erklärung der Unterschiede zwischen den beiden.

Func<T, TResult> ist nur ein generischen Delegaten - herausfinden, was es bedeutet, in einer bestimmten Situation durch ersetzen der type Parameter (T und TResult) mit den entsprechenden Typargumenten (int und string) in der Erklärung. Ich habe umbenannt es auch um Verwirrung zu vermeiden:

string ExpandedFunc(int x)

Mit anderen Worten, Func<int, string> ist ein Delegierter, der eine Funktion nimmt ein int Argument darstellt und eine string zurück.

Func<T, TResult> oft in LINQ verwendet wird, sowohl für Projektionen und Prädikate (im letzteren Fall ist TResult immer bool). Zum Beispiel könnten Sie eine Func<int, string> verwenden, um eine Folge von ganzen Zahlen in eine Folge von Strings zu projizieren. Lambda-Ausdrücke ist in der Regel in LINQ verwendet, um die entsprechenden 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

Andere Tipps

Ein Func<int, string> isst ints und kehrt Saiten. Also, was isst ints und kehrt Strings? Wie wäre es damit ...

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

Dort habe ich nur eine Funktion aus, die Ints und gibt Strings isst. Wie würde ich es verwenden?

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, dass eine Menge Tricks basieren auf. Nun lassen Sie uns stattdessen eine Func verwenden.

Func<int, string> fnc = IntAsString;

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

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

Statt sich auf jedes Mitglied des Aufrufs IntAsString, habe ich einen Verweis darauf FNC (diese Verweise auf Methoden aufgerufen werden genannt Delegierten ) und verwendet, dass statt. (Denken Sie daran FNC isst ints und kehrt Strings).

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

Eines der besten Primer auf diesen Sachen, die ich gesehen habe, ist hier . Er ist viel reale Beispiele bekommt. :)

Es ist ein Delegat, der eine int als Parameter und gibt einen Wert vom Typ string.

Hier ist ein Beispiel für die 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();
    }
}

Func<int, string> akzeptiert einen int-Wert Parameter und gibt einen String-Wert. Hier ist ein Beispiel, bei dem eine zusätzliche Unterstützungsverfahren nicht notwendig 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 (das heißt „string“ in diesem Beispiel) ist die Funktionen Typen zurückgeben (das heißt nicht auf Primitiven beschränkt, sondern jedes Objekt). Daher Func<int, bool, float> akzeptiert int und bool Wertparameter und gibt einen Float-Wert.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top