Digamos que tengo una consulta LINQ como:
var authors = from x in authorsList
where x.firstname == "Bob"
select x;
Dado que authorsList
es de tipo List<Author>
, ¿cómo puedo eliminar los Author
elementos authorsList
que devuelve la consulta authors
?
O, dicho de otro modo, ¿cómo puedo eliminar todos los nombres que igualan a Bob authorsList
?
Nota: Este es un ejemplo simplificado para los propósitos de la pregunta.
Contains
verificación sea rápida y garantiza que solo evalúe la secuencia una vez.List<T>
, está bien usarlo.authorsList = authorsList.Where(x => x.FirstName != "Bob")
Sería mejor usar List <T> .RemoveAll para lograr esto.
fuente
Si realmente necesita eliminar elementos, ¿qué pasa con Except ()?
Puede eliminar en función de una nueva lista, o eliminar sobre la marcha anidando el Linq.
fuente
Except()
es la única forma de ir en medio de la declaración LINQ.IEnumerable
no tieneRemove()
niRemoveAll()
.No puede hacer esto con operadores estándar de LINQ porque LINQ proporciona soporte de consulta, no actualización.
Pero puede generar una nueva lista y reemplazar la anterior.
O puede eliminar todos los elementos
authors
en una segunda pasada.fuente
RemoveAll()
No es un operador LINQ.Remove
también es un métodoList
<T
>, no un método System.Linq.Enumerable .Solución simple:
fuente
Me preguntaba si hay alguna diferencia entre
RemoveAll
yExcept
las ventajas del usoHashSet
, por lo que he realizado una comprobación rápida del rendimiento :)Resultados a continuación:
Como podemos ver, la mejor opción en ese caso es usar
RemoveAll(HashSet)
fuente
l2.RemoveAll( new HashSet<string>( toRemove ).Contains );
compila bien solo para su informaciónEsta es una pregunta muy antigua, pero encontré una forma muy simple de hacer esto:
Tenga en cuenta que dado que la variable de retorno
authorsList
es aList<T>
, elIEnumerable<T>
devuelto porExcept()
debe convertirse en aList<T>
.fuente
Puedes eliminar de dos maneras
o
Tuve el mismo problema, si desea una salida simple basada en su condición where, entonces la primera solución es mejor.
fuente
Supongamos que
authorsToRemove
es unIEnumerable<T>
elemento que contiene los elementos que desea eliminarauthorsList
.Luego, aquí hay otra forma muy simple de realizar la tarea de eliminación solicitada por el OP:
fuente
Creo que podrías hacer algo como esto
Aunque creo que las soluciones ya dadas resuelven el problema de una manera más legible.
fuente
A continuación se muestra el ejemplo para eliminar el elemento de la lista.
fuente
LINQ tiene sus orígenes en la programación funcional, que enfatiza la inmutabilidad de los objetos, por lo que no proporciona una forma integrada de actualizar la lista original en el lugar.
Nota sobre la inmutabilidad (tomada de otra respuesta SO):
Aquí está la definición de inmutabilidad de Wikipedia .
fuente
Creo que solo tiene que asignar los elementos de la lista de Autor a una nueva lista para tener ese efecto.
fuente
Para mantener el código fluido (si la optimización del código no es crucial) y necesitaría realizar algunas operaciones adicionales en la lista:
o
fuente