2010-06-03 9 views
16

me gustaría escribir:Crear IEnumerable <T> .find()

IEnumerable<Car> cars; 
cars.Find(car => car.Color == "Blue") 

¿Puedo lograr esto con los métodos de extensión? Lo siguiente falla porque se llama a sí mismo recursivamente en lugar de llamar a IList.Find().

public static T Find<T>(this IEnumerable<T> list, Predicate<PermitSummary> match) 
{ 
    return list.ToList().Find(match); 
} 

Gracias!

Respuesta

46

Este método ya existe. Se llama FirstOrDefault

cars.FirstOrDefault(car => car.Color == "Blue"); 

Si se va a aplicar por sí mismo que se vería un poco como esta

public static T Find<T>(this IEnumerable<T> enumerable, Func<T,bool> predicate) { 
    foreach (var current in enumerable) { 
    if (predicate(current)) { 
     return current; 
    } 
    } 
    return default(T); 
} 
+0

Gracias. No me di cuenta de que esta sobrecarga existía. –

+0

¡Gran respuesta! Nunca me di cuenta de que esta sobrecarga existía y he estado añadiendo declaraciones superfluas. Donde (...). Primero(). – jhappoldt

3

Usted sabe que Find(...) pueden ser reemplazados por Where/First

IEnumerable<Car> cars; 
var result = cars.Where(c => c.Color == "Blue").FirstOrDefault(); 

esto va devuelva null en caso de que el predicado no coincida.

+3

No hay necesidad de Where. FirstOrDefault tomará el Predicado también. – Stephan

+3

Puede especificar el predicado directamente en 'FirstOrDefault()' y dejar 'Where()' out. –

+0

Ah, tienes razón, olvidaste el predicado. – Aren

8

Jared es correcto si está buscando un solo automóvil azul, cualquier automóvil azul será suficiente. ¿Es eso lo que estás buscando, o estás buscando una lista de autos azules?

primer coche azul:

Car oneCar = cars.FirstOrDefault(c => c.Color.Equals("Blue")); 

Lista de los coches azules:

IEnumerable<Car> manyCars = cars.FindAll(car => car.Color.Equals("Blue")); 
+0

Gracias, y si está buscando exactamente un automóvil azul: automóviles. Solo (coche => automóvil.Color.Equals ("Azul") –

+0

Individual está bien si se garantiza que TIENE SOLO UN coche en la lista completa. Si tiene más de un automóvil, o ninguno, lanzará una InvalidOperationException. FirstOrDefault devolverá su automóvil azul, o el tipo predeterminado (a menudo nulo). Primero emitirá una excepción si no hay nada que coincida. el predicado. – StyxRiver

Cuestiones relacionadas