Func vs. Action vs. Predicate
Func vs. Action vs. Predicate
Func vs. Action vs. Predicate
Re: Func vs. Action vs. Predicate
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.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` 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` for methods like `FindAll` and `RemoveAll`.
`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.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` 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` for methods like `FindAll` and `RemoveAll`.