function与动作与谓词

有了真实的例子和他们的使用,有人可以帮我理解:

  1. 我们什么时候需要Func委托?
  2. 我们什么时候需要行动委托?
  3. 我们什么时候需要Predicates委托?

FuncAction的区别在于你是否希望代理返回一个值(使用Func )或不使用Action (使用Action )。

Func可能在LINQ中最常用 – 例如在预测中:

  list.Select(x => x.SomeProperty) 

或过滤:

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

或按键select:

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

Action更常用于List<T>.ForEach :为列表中的每个项目执行给定的操作。 我使用这个比Funcless,虽然我有时使用无参数的版本,如Control.BeginInvokeDispatcher.BeginInvoke

Predicate仅仅是一个特殊的Func<T, bool> ,在所有的Func和大部分Action代表出现之前就已经介绍过了。 我怀疑,如果我们已经有了各种forms的FuncActionPredicate就不会被引入……虽然它赋予了代表的使用一定的含义,而FuncAction则被用于广泛的分离目的。

Predicate主要用于List<T>用于FindAllRemoveAll等方法。

Action是一个方法的委托(指针),它取零,一个或多个input参数,但不返回任何内容。

Func是一个方法的委托(指针),它取零,一个或多个input参数,并返回一个值(或引用)。

谓词是经常用于比较的一种特殊types的Func。

尽pipeLinq广泛使用,但Action和Func在概念上是独立于Linq的。 C ++已经包含了types化函数指针forms的基本概念。

下面是不使用Linq的Action和Func的一个小例子:

 class Program { static void Main(string[] args) { Action<int> myAction = new Action<int>(DoSomething); myAction(123); // Prints out "123" // can be also called as myAction.Invoke(123); Func<int, double> myFunc = new Func<int, double>(CalculateSomething); Console.WriteLine(myFunc(5)); // Prints out "2.5" } static void DoSomething(int i) { Console.WriteLine(i); } static double CalculateSomething(int i) { return (double)i/2; } } 

Func – 当你想要一个可能或不可以带参数并返回一个值的函数的委托。 最常见的例子是从LINQ中select:

 var result = someCollection.Select( x => new { x.Name, x.Address }); 

行动 – 当你想要一个函数的委托,可能会或可能不带参数,并没有返回一个值。 我经常使用这些匿名事件处理程序:

 button1.Click += (sender, e) => { /* Do Some Work */ } 

谓词 – 当你想要一个Func的专用版本,它根据一组条件评估一个值并返回一个布尔结果(对于匹配是true,否则为false)。 再次,这些在LINQ中经常用于像Where:

 var filteredResults = someCollection.Where(x => x.someCriteriaHolder == someCriteria); 

我只是加倍检查,事实certificate,LINQ不使用谓词。 不知道他们为什么做出这个决定……但从理论上来说,这仍然是一个谓词适合的情况。