Question Func vs. Action vs. Prédicat [duplicate]


Cette question a déjà une réponse ici:

Avec de vrais exemples et leur utilisation, quelqu'un peut m'aider s'il vous plaît à comprendre:

  1. Quand avons-nous besoin d'un délégué Func?
  2. Quand avons-nous besoin d'un délégué à l'action?
  3. Quand avons-nous besoin d'un délégué Predicates?

606
2017-11-30 19:07


origine


Réponses:


La différence entre Func et Action est simplement de savoir si vous voulez que le délégué renvoie une valeur (utilisez Func) ou non (utiliser Action).

Func est probablement le plus couramment utilisé dans LINQ - par exemple dans les projections:

 list.Select(x => x.SomeProperty)

ou filtrage:

 list.Where(x => x.SomeValue == someOtherValue)

ou sélection de clé:

 list.Join(otherList, x => x.FirstKey, y => y.SecondKey, ...)

Action est plus communément utilisé pour des choses comme List<T>.ForEach: exécute l'action donnée pour chaque élément de la liste. J'utilise cela moins souvent que Func, Bien que je faire parfois utiliser la version sans paramètre pour des choses comme Control.BeginInvoke et Dispatcher.BeginInvoke.

Predicate est juste un cas spécial Func<T, bool> vraiment, introduit avant tout le Func et la plupart des Action les délégués sont venus. Je soupçonne que si nous avions déjà eu Func et Action dans leurs différentes formes, Predicate n'aurait pas été introduit ... bien qu'il Est-ce que communiquer un certain sens à l'utilisation du délégué, alors que Func et Action sont utilisés à des fins très disparates.

Predicate est principalement utilisé dans List<T> pour des méthodes comme FindAll et RemoveAll.


781
2017-11-30 19:11



action est un délégué (pointeur) à une méthode, qui prend zéro, un ou plusieurs paramètres d'entrée, mais ne renvoie rien.

Func est un délégué (pointeur) à une méthode, qui prend zéro, un ou plusieurs paramètres d'entrée, et renvoie une valeur (ou une référence).

Prédicat est un type spécial de Func souvent utilisé pour les comparaisons.

Bien que largement utilisé avec Linq, Action et Func sont des concepts logiquement indépendants de Linq. C ++ contenait déjà le concept de base sous forme de pointeurs de fonction typés.

Voici un petit exemple pour Action et Func sans utiliser Linq:

class Program
{
    static void Main(string[] args)
    {
        Action<int> myAction = new Action<int>(DoSomething);
        myAction(123);           // Prints out "123"
                                 // can be also called as myAction.Invoke(123);

        Func<int, double> myFunc = new Func<int, double>(CalculateSomething);
        Console.WriteLine(myFunc(5));   // Prints out "2.5"
    }

    static void DoSomething(int i)
    {
        Console.WriteLine(i);
    }

    static double CalculateSomething(int i)
    {
        return (double)i/2;
    }
}

304
2017-10-02 09:28



Func - Lorsque vous voulez un délégué pour une fonction qui peut ou non prendre des paramètres et renvoie une valeur. L'exemple le plus courant serait Sélectionner à partir de LINQ:

var result = someCollection.Select( x => new { x.Name, x.Address });

action - Lorsque vous voulez un délégué pour une fonction qui peut ou non prendre des paramètres et ne retourne pas une valeur. Je les utilise souvent pour les gestionnaires d'événements anonymes:

button1.Click += (sender, e) => { /* Do Some Work */ }

Prédicat - Quand vous voulez une version spécialisée d'un Func qui évalue une valeur par rapport à un ensemble de critères et retourne un résultat booléen (vrai pour une correspondance, faux sinon). Encore une fois, ils sont souvent utilisés dans LINQ pour des choses comme:

var filteredResults = 
    someCollection.Where(x => x.someCriteriaHolder == someCriteria);


57
2017-11-30 19:13