¿Qué es un Delegado Predicado y dónde debería usarse?

Resuelto Canavar asked hace 15 años • 9 respuestas

Me puedes explicar:

  • ¿Qué es un delegado predicado?
  • ¿Dónde deberíamos usar predicados?
  • ¿Alguna mejor práctica al utilizar predicados?

Se agradecerá el código fuente descriptivo.

Canavar avatar Feb 17 '09 18:02 Canavar
Aceptado

Un predicado es una función que devuelve trueo false. Un delegado de predicado es una referencia a un predicado.

Básicamente, un delegado de predicado es una referencia a una función que devuelve trueo false. Los predicados son muy útiles para filtrar una lista de valores; aquí hay un ejemplo.

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> list = new List<int> { 1, 2, 3 };

        Predicate<int> predicate = new Predicate<int>(greaterThanTwo);

        List<int> newList = list.FindAll(predicate);
    }

    static bool greaterThanTwo(int arg)
    {
        return arg > 2;
    }
}

Ahora, si estás usando C# 3, puedes usar una lambda para representar el predicado de una manera más limpia:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> list = new List<int> { 1, 2, 3 };

        List<int> newList = list.FindAll(i => i > 2);
    }
}
Andrew Hare avatar Feb 17 '2009 11:02 Andrew Hare

A partir de la respuesta de Andrew con respecto a c#2 y c#3... también puedes hacerlos en línea para una función de búsqueda única (ver más abajo).

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> list = new List<int> { 1, 2, 3 };

        List<int> newList = list.FindAll(delegate(int arg)
                           {
                               return arg> 2;
                           });
    }
}

Espero que esto ayude.

WestDiscGolf avatar Feb 17 '2009 11:02 WestDiscGolf

Sólo un delegado que devuelve un valor booleano. Se usa mucho en listas de filtrado, pero se puede usar donde quieras.

List<DateRangeClass>  myList = new List<DateRangeClass<GetSomeDateRangeArrayToPopulate);
myList.FindAll(x => (x.StartTime <= minDateToReturn && x.EndTime >= maxDateToReturn):
Adam Carr avatar Feb 17 '2009 11:02 Adam Carr

Hay un buen artículo sobre predicados aquí , aunque es de la era .NET2, por lo que no se mencionan expresiones lambda allí.

LukeH avatar Feb 17 '2009 11:02 LukeH