Pregunta

Después de buscar en MSDN, todavía no me queda claro cómo debo formar un predicado adecuado para usar el método Find () en la Lista usando una variable miembro de T (donde T es una clase)

Por ejemplo:

public class Car
{
   public string Make;
   public string Model;
   public int Year;
}

{  // somewhere in my code
   List<Car> carList = new List<Car>();
   // ... code to add Cars ...

   Car myCar = new Car();

   // Find the first of each car made between 1980 and 2000
   for (int x = 1980; x < 2000; x++)
   {
       myCar = carList.Find(byYear(x));
       Console.Writeline(myCar.Make + myCar.Model);
   }
}

¿Qué debería hacer mi " byYear " como se ve el predicado?

(El ejemplo de MSDN solo habla de una Lista de dinosaurios y solo busca un valor inmutable " saurus " No muestra cómo pasar un valor al predicado ...)

EDITAR: Estoy usando VS2005 / .NET2.0, así que no creo que la notación Lambda esté disponible para mí ...

EDIT2: eliminado " 1999 " en el ejemplo porque es posible que desee " Buscar " Programáticamente basado en diferentes valores. El ejemplo cambió a la gama de automóviles de 1980 a 2000 utilizando el bucle for-do.

¿Fue útil?

Solución

Ok, en .NET 2.0 puedes usar delegados, así:

static Predicate<Car> ByYear(int year)
{
    return delegate(Car car)
    {
        return car.Year == year;
    };
}

static void Main(string[] args)
{
    // yeah, this bit is C# 3.0, but ignore it - it's just setting up the list.
    List<Car> list = new List<Car>
    {
        new Car { Year = 1940 },
        new Car { Year = 1965 },
        new Car { Year = 1973 },
        new Car { Year = 1999 }
    };
    var car99 = list.Find(ByYear(1999));
    var car65 = list.Find(ByYear(1965));

    Console.WriteLine(car99.Year);
    Console.WriteLine(car65.Year);
}

Otros consejos

Puedes usar una expresión lambda de la siguiente manera:

myCar = carList.Find(car => car.Year == 1999);

O puede usar un delegado anónimo:

Car myCar = cars.Find(delegate(Car c) { return c.Year == x; });

// If not found myCar will be null
if (myCar != null)
{
     Console.Writeline(myCar.Make + myCar.Model);
}

Ya que no puedes usar lambda, simplemente puedes reemplazarlo con un delegado anónimo.

myCar = carList.Find(delegate(Car car) { return car.Year == i; });

Hmm. Pensando más en eso, podrías usar el curry para devolver un predicado.

Func<int, Predicate<Car>> byYear = i => (c => c.Year == i);

Ahora puede pasar el resultado de esta función (que es un predicado) a su método de búsqueda:

my99Car = cars.Find(byYear(1999));
my65Car = cars.Find(byYear(1965));

También puedes usar esto:

var existData =
    cars.Find(
     c => c.Year== 1999);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top