<p>La différence entre <code>Func</code> et <code>Action</code> est simplement de savoir si vous voulez que le délégué retourne une valeur (utilisez <code>Func</code>) ou non (utilisez <code>Action</code>).</p>
<p><code>Func</code> est probablement le plus couramment utilisé dans LINQ - par exemple dans les projections :</p>
<pre><code class="lang-auto"> list.Select(x => x.SomeProperty)
</code></pre>
<p>ou le filtrage :</p>
<pre><code class="lang-auto"> list.Where(x => x.SomeValue == someOtherValue)
</code></pre>
<p>ou la sélection de clé :</p>
<pre><code class="lang-auto"> list.Join(otherList, x => x.FirstKey, y => y.SecondKey, ...)
</code></pre>
<p><code>Action</code> est plus couramment utilisé pour des choses comme <code>List<T>.ForEach</code> : exécuter l’action donnée pour chaque élément de la liste. Je l’utilise moins souvent que <code>Func</code>, bien que j’utilise <em>parfois</em> la version sans paramètre pour des choses comme <code>Control.BeginInvoke</code> et <code>Dispatcher.BeginInvoke</code>.</p>
<p><code>Predicate</code> est en réalité juste un cas spécial de <code>Func<T, bool></code>, introduit avant que tous les délégués <code>Func</code> et la plupart des délégués <code>Action</code> n’arrivent. Je soupçonne que si nous avions déjà eu <code>Func</code> et <code>Action</code> dans leurs différentes formes, <code>Predicate</code> n’aurait pas été introduit… bien qu’il <em>transmette</em> une certaine signification à l’utilisation du délégué, alors que <code>Func</code> et <code>Action</code> sont utilisés pour des objectifs très disparates.</p>
<p><code>Predicate</code> est principalement utilisé dans <code>List<T></code> pour des méthodes comme <code>FindAll</code> et <code>RemoveAll</code>.</p>