2010-07-24 9 views
10

Si tengoLINQ Quitar elemento de tabla de objeto donde la propiedad es igual al valor

IEnumberable<Car> list 

y quiero eliminar un elemento de esta lista sobre la base de una propiedad del coche

Quiero algo como:

list.RemoveWhere(r=>r.Year > 2000) 

hace algo como esto existe?

estoy haciendo esto una y otra vez por lo que quiero evitar la copia de la lista cada vez para eliminar un solo elemento

+0

¿Es un '' Lista o simplemente un '' IEnumerable ? –

Respuesta

13

IEnumberable es inmutable, pero se puede a algo como esto:

list = list.Where(r=>r.Year<=2000) 

o escribir un método de extensión:

public static IEnumerable<T> RemoveWhere<T>(this IEnumerable<T> query, Predicate<T> predicate) 
{ 
    return query.Where(e => !predicate(e)); 
} 
+0

ver la pregunta actualizada – leora

+0

@ooo IEnumerable es inmutable, por lo que no puede simplemente agregar o quitar elementos, es imposible. Por supuesto, puedes usar una lista, pero no es posible decir si esto sería más rápido. Si hace esto una y otra vez, tenga en cuenta la ejecución diferida. – sloth

4

Si está trabajando con IEnumerable<T>, ¿qué hay de dónde?

list = list.Where(car => car.Year <= 2000); 

Si está trabajando con ICollection<T> y no acaba de obtener un resultado filtrado, pero en realidad la intención de manipular la colección de origen, se puede crear un propio hecho a medida de extensión para la recolección:

public static class CollectionExtensions { 
    public static ICollection<T> RemoveWhere<T>(this ICollection<T> collection, Func<T, bool> predicate) { 
     List<T> toRemove = collection.Where(item => predicate(item)).ToList(); 
     toRemove.ForEach(item => collection.Remove(item)); 
     return collection; 
    } 
    } 
+0

ver la pregunta actualizada – leora

+0

Ver mi respuesta actualizada ;-) –

6

muy tarde a la fiesta, pero para cualquiera lo haría se encuentra con este problema, aquí es una solución más limpia:

MyList.RemoveAll(p => p.MyProperty == MyValue); 
Cuestiones relacionadas