Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Func vs. Action vs. Predicate [duplicate]

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?
like image 491
InfoLearner Avatar asked Nov 30 '10 19:11

InfoLearner


People also ask

Could you explain the difference between func vs Action vs predicate?

Func is a delegate (pointer) to a method, that takes zero, one or more input parameters, and returns a value (or reference). Predicate is a special kind of Func often used for comparisons (takes a generic parameter and returns bool).

Is there any difference between action and function?

The difference between Func and Action is the return type of the method they point to. Action references a method with no return type. And, Func references a method with a return type.

What is the difference between Func and delegate?

Func is a generic delegate included in the System namespace. It has zero or more input parameters and one out parameter. The last parameter is considered as an out parameter. This delegate can point to a method that takes up to 16 Parameters and returns a value.

What is Lambda expressions action Func and predicate?

Func, Action and Predicate are generic inbuilt delegates present in System namespace. All three can be used with method, anonymous method and lambda expression. Func can contains 0 to 16 input parameters and must have one return type. Action can contain 1 to 16 input parameters and does not have any return type.


1 Answers

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.

like image 105
Jon Skeet Avatar answered Nov 21 '22 14:11

Jon Skeet