Search code examples
c#delegatesactionfunc

Func vs. Action vs. Predicate


With real examples and their use, can someone please help me understand:

  1. When do we need a Func<T, ..> delegate?
  2. When do we need an Action<T> delegate?
  3. When do we need a Predicate<T> delegate?

Solution

  • The difference between Func and Action is simply whether you want the delegate to return a value (use Func) or not (use Action).

    Func is probably most commonly used in LINQ - for example in projections:

     list.Select(x => x.SomeProperty)
    

    or filtering:

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

    or key selection:

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

    Action is more commonly used for things like List<T>.ForEach: execute the given action for each item in the list. I use this less often than Func, although I do sometimes use the parameterless version for things like Control.BeginInvoke and Dispatcher.BeginInvoke.

    Predicate is just a special cased Func<T, bool> really, introduced before all of the Func and most of the Action delegates came along. I suspect that if we'd already had Func and Action in their various guises, Predicate wouldn't have been introduced... although it does impart a certain meaning to the use of the delegate, whereas Func and Action are used for widely disparate purposes.

    Predicate is mostly used in List<T> for methods like FindAll and RemoveAll.