Func<T, bool>; asks the question “does the specified argument satisfy the condition represented by the delegate?” Used in things like List.FindAll.
Action: Perform an action given the arguments. Very general purpose. Not used much in LINQ as it implies side-effects, basically.
Func: Used extensively in LINQ, usually to transform the argument, e.g. by projecting a complex structure to one property.
Other important delegates:
EventHandler<T>: Used all over WinForms
IComparer<T>but in delegate form.
The difference between
Action is simply whether you want the delegate to return a value (use
Func) or not (use
Func is probably most commonly used in LINQ – for example in projections:
list.Select(x => x.SomeProperty)
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
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
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
Action are used for widely disparate purposes.
Predicate is mostly used in
List<T> for methods like