首页 文章

Func vs. Action vs. Predicate [复制]

提问于
浏览
632

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

通过实例和它们的使用,有人可以帮助我理解:

  • 我们什么时候需要Func委托?

  • 我们什么时候需要行动委托?

  • 我们什么时候需要Predicates委托?

3 回答

  • 807

    FuncAction 之间的区别仅在于您是否希望委托返回值(使用 Func )或不使用 Action (使用 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 代表出现之前介绍过 . 我怀疑,如果我们已经有各种伪装的 FuncAction ,那么 Predicate 就不会被引入......虽然它确实赋予代表使用某种意义,而 FuncAction 则被广泛使用目的 .

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

  • 58

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

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

    Predicate 是一种特殊的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;
        }
    }
    
  • 320

    Func - 当您需要某个函数的委托时,该函数可能会也可能不会获取参数并返回一个值 . 最常见的例子是从LINQ中选择:

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

    Action - 当您想要一个可能带有或不带参数但不返回值的函数的委托时 . 我经常将它们用于匿名事件处理程序:

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

    Predicate - 当您需要一个特殊版本的Func,它根据一组条件评估一个值并返回一个布尔结果(匹配为true,否则为false) . 同样,这些在LINQ中经常用于像Where这样的东西:
    var filteredResults =
    someCollection.Where(x => x.someCriteriaHolder == someCriteria);

    我只是仔细检查,结果是LINQ不使用Predicates . 不确定他们为什么做出这个决定......但理论上它仍然是一个谓词适合的情况 .

相关问题