功能与动作与谓词

这个问题在这里已经有了答案:

  • 代表:Predicate Action Func 7个答案

  • FuncAction的区别在于你是否想让委托返回一个值(使用Func )或不使用(使用Action )。

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

     list.Select(x => x.SomeProperty)
    

    或过滤:

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

    或按键选择:

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

    Action更常用于List<T>.ForEach :为列表中的每个项目执行给定的操作。 虽然我有时会使用无参数的版本来处理像Control.BeginInvokeDispatcher.BeginInvoke这样的事情,但我并不比Func频繁使用它。

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

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


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

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

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

    虽然Linq广泛使用,但Action和Func在概念上独立于Linq。 C ++已经以类型化函数指针的形式包含了基本概念。

    这里是Action和Func的一个小例子,不使用Linq:

    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中选择:

    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);
    

    我只是加倍检查,结果证明LINQ不使用谓词。 不知道他们为什么做出这个决定......但理论上它仍然是一个谓词适合的情况。

    链接地址: http://www.djcxy.com/p/31593.html

    上一篇: Func vs. Action vs. Predicate

    下一篇: converting a .net Func<T> to a .net Expression<Func<T>>