Question

Je me demandais si quelqu'un pourrait expliquer ce Func<int, string> est et comment il est utilisé avec des exemples clairs.

Était-ce utile?

La solution

Êtes-vous familier avec les délégués en général? J'ai une page sur délégués et des événements qui peuvent aider sinon, même si elle est plus orientée vers expliquant les différences entre les deux.

Func<T, TResult> est juste un délégué générique - élaborer ce que cela signifie dans une situation donnée en remplaçant le paramètres de type (T et TResult) avec les correspondants Type arguments (int et string) dans la déclaration. Je l'ai aussi il renomme pour éviter toute confusion:

string ExpandedFunc(int x)

En d'autres termes, Func<int, string> est un délégué qui représente une fonction qui prend un argument int et en retournant une string.

Func<T, TResult> est souvent utilisé dans LINQ, tant pour les projections et les prédicats (dans ce dernier cas, TResult est toujours bool). Par exemple, vous pouvez utiliser un Func<int, string> pour projeter une suite d'entiers en une séquence de chaînes. Les expressions lambda sont généralement utilisés dans LINQ pour créer les délégués concernés:

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

Résultat:

Value=3
Value=7
Value=10

Autres conseils

A Func<int, string> mange ints et les chaînes de retours. Alors, que mange des chaînes INTs et retours? Que diriez-vous cela ...

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

Là, je viens de faire une fonction qui mange ints et renvoie des chaînes. Comment puis-je utiliser?

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"

Pas très sexy, je sais, mais c'est l'idée simple que beaucoup de tours sont basées sur. Maintenant, nous allons utiliser un Func à la place.

Func<int, string> fnc = IntAsString;

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

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

Au lieu d'appeler IntAsString sur chaque membre, j'ai créé une référence à elle appelé fnc (ces références à des méthodes sont appelées délégués ) et utilisé qu'au lieu. (Rappelez-vous fnc mange des chaînes INTs et retours).

Cet exemple est pas très sexy, mais une tonne de trucs astucieux que vous verrez est basé sur l'idée simple des fonctions, des délégués et méthodes d'extension .

L'une des meilleures amorces sur ce genre de choses que j'ai vu est ici . Il a beaucoup plus d'exemples réels. :)

Il est un délégué qui prend une int en tant que paramètre et renvoie une valeur de type string.

Voici un exemple de son utilisation:

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> accepte un paramètre de valeur int et renvoie une valeur de chaîne. Voici un exemple où une méthode d'appui supplémentaire est inutile.

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

NOTE: Le dernier type d'objet dans Func (à savoir « string » dans cet exemple) sont les fonctions de type retour (à savoir ne se limite pas aux primitives, mais tout objet). , Func<int, bool, float> accepte donc les paramètres int et valeur bool, et retourne une valeur flottante.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top