Func vs. Action vs. Predicate

Func vs. Action vs. Predicate

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

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

 list.Select(x => x.SomeProperty)

ou le filtrage :

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

ou la sélection de clé :

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

Action est plus couramment utilisé pour des choses comme List<T>.ForEach : exécuter l’action donnée pour chaque élément de la liste. Je l’utilise moins souvent que Func, bien que j’utilise parfois la version sans paramètre pour des choses comme Control.BeginInvoke et Dispatcher.BeginInvoke.

Predicate est en réalité juste un cas spécial de Func<T, bool>, introduit avant que tous les délégués Func et la plupart des délégués Action n’arrivent. 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 transmette une certaine signification à l’utilisation du délégué, alors que Func et Action sont utilisés pour des objectifs très disparates.

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