Pregunta Func vs. Acción vs. Predicado [duplicado]


Esta pregunta ya tiene una respuesta aquí:

Con ejemplos reales y su uso, alguien puede ayudarme a entender:

  1. ¿Cuándo necesitamos el delegado de Func?
  2. ¿Cuándo necesitamos el delegado de Acción?
  3. ¿Cuándo necesitamos el delegado Predicates?

606
2017-11-30 19:07


origen


Respuestas:


La diferencia entre Func y Action es simplemente si desea que el delegado devuelva un valor (use Func) o no (uso Action)

Func es probablemente el más comúnmente utilizado en LINQ, por ejemplo, en proyecciones:

 list.Select(x => x.SomeProperty)

o filtrado:

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

o la selección de la clave:

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

Action es más comúnmente utilizado para cosas como List<T>.ForEach: ejecuta la acción dada para cada elemento en la lista. Lo uso con menos frecuencia que Func, Aunque yo hacer a veces usan la versión sin parámetros para cosas como Control.BeginInvoke y Dispatcher.BeginInvoke.

Predicate es solo una carcasa especial Func<T, bool> realmente, presentado antes de todo el Func y la mayoría de Action Los delegados vinieron. Sospecho que si ya hubiéramos tenido Func y Action en sus diversas formas, Predicate no habría sido introducido ... aunque hace impartir un cierto significado al uso del delegado, mientras que Func y Action se utilizan para fines muy dispares.

Predicate se usa principalmente en List<T> para métodos como FindAll y RemoveAll.


781
2017-11-30 19:11



Acción es un delegado (puntero) a un método, que toma cero, uno o más parámetros de entrada, pero no devuelve nada.

Func es un delegado (puntero) a un método, que toma cero, uno o más parámetros de entrada, y devuelve un valor (o referencia).

Predicado es un tipo especial de Func que se usa a menudo para las comparaciones.

Aunque ampliamente utilizado con Linq, Action y Func son conceptos lógicamente independientes de Linq. C ++ ya contenía el concepto básico en forma de punteros de función tipeados.

Aquí hay un pequeño ejemplo para Action y Func sin usar 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;
    }
}

304
2017-10-02 09:28



Func - Cuando desee un delegado para una función que puede o no tomar parámetros y devolver un valor. El ejemplo más común sería Seleccionar de LINQ:

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

Acción - Cuando quiere un delegado para una función que puede o no tomar parámetros y no devuelve un valor. Los uso a menudo para manejadores de eventos anónimos:

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

Predicado - Cuando desee una versión especializada de un Func que evalúe un valor contra un conjunto de criterios y devuelva un resultado booleano (verdadero para una coincidencia, falso en caso contrario). De nuevo, estos se usan en LINQ con bastante frecuencia para cosas como Where:

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


57
2017-11-30 19:13