ventajas usar tipos tipo runtimebinderexception runtimebinder puede microsoft los invocar hilos funciones funcionan funcion eventos delegados delegado csharp como anonimas c# list delegates find predicate

c# - usar - tipos de delegates



¿Cómo puedo formar un buen delegado predicado para Encontrar() algo en mi Lista<T>? (6)

Después de buscar en MSDN, aún no está claro cómo debería formar un predicado adecuado para usar el método Find () en List 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); } }

¿Cómo debería ser mi predicado "byYear"?

(El ejemplo de MSDN solo habla de una Lista de dinosaurios y solo busca un valor invariable "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: Se eliminó "1999" en el ejemplo porque es posible que desee "Buscar" programáticamente en función de diferentes valores. El ejemplo cambió a la gama de autos de 1980 a 2000 utilizando el ciclo for-do.


Como no puede usar lambda, puede reemplazarlo con un delegado anónimo.

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


Hmm. Pensando más en eso, podría usar currying 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 Find:

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


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); }


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); }


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

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


Puedes usar esto también:

var existData = cars.Find( c => c.Year== 1999);