Func vs. Action vs. Predicate

This question already has an answer here:

  • Delegates: Predicate Action Func 7 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 .


    Action is a delegate (pointer) to a method, that takes zero, one or more input parameters, but does not return anything.

    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.

    Though widely used with Linq, Action and Func are concepts logically independent of Linq. C++ already contained the basic concept in form of typed function pointers.

    Here is a small example for Action and Func without using 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 - When you want a delegate for a function that may or may not take parameters and returns a value. The most common example would be Select from LINQ:

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

    Action - When you want a delegate for a function that may or may not take parameters and does not return a value. I use these often for anonymous event handlers:

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

    Predicate - When you want a specialized version of a Func that takes evaluates a value against a set of criteria and returns a boolean result (true for a match, false otherwise). Again, these are used in LINQ quite frequently for things like Where:

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

    I just double checked and it turns out that LINQ doesn't use Predicates. Not sure why they made that decision...but theoretically it is still a situation where a Predicate would fit.

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

    上一篇: 一个C#lambda表达式可以有多个语句吗?

    下一篇: 功能与动作与谓词