var itemToRemove = resultlist.Single(r => r.Id==2);
resultList.Remove(itemToRemove);
Cuando no esté seguro de que el elemento realmente exista, puede usar SingleOrDefault . SingleOrDefaultregresará nullsi no hay ningún artículo ( Singlearrojará una excepción cuando no pueda encontrar el artículo). Ambos se lanzarán cuando haya un valor duplicado (dos elementos con el mismo id).
var itemToRemove = resultlist.SingleOrDefault(r => r.Id==2);if(itemToRemove !=null)
resultList.Remove(itemToRemove);
Será eliminar los elementos 2 y 3 y mantener los elementos 1 y 4 - tal como se especifica por el removeList. Tenga en cuenta que esto sucede en su lugar, por lo que no se requiere asignación adicional.
Por supuesto, también puede usarlo en elementos individuales como:
Hay un pequeño ayudante de Linq que me gusta que es fácil de implementar y puede hacer que las consultas con condiciones "donde no" sean un poco más fáciles de leer:
publicstaticIEnumerable<T>ExceptWhere<T>(thisIEnumerable<T> source,Predicate<T> predicate){return source.Where(x=>!predicate(x));}//usage in above situation
resultList = results.ExceptWhere(x=>x.Id==2).ToList();
Otro enfoque similar (que usa un predicado) es usar List.FindIndex/ List.RemoteAt(que tiene la característica "agradable" o "no tan agradable" de ser una operación mutante).
Es cierto, pero tenga cuidado al decir que la operación de List está mutando. List utiliza una matriz detrás de escena, y puede recrear su matriz con una capacidad menor o mayor cuando lo considere necesario. Por lo general , la eliminación es una mutación in situ de la matriz existente.
KeithS
Esta caja fuerte hilo isnt, y por su sencillez sólo se puede utilizar SingleOrDefault, doesnt necesidad de estar contenida en un método estático
Nadie dijo que fuera seguro para subprocesos (y si depende de lo que se supone que deben estar haciendo los subprocesos; de hecho, puede ser preferible dar una construcción en memoria diferente a un subproceso de trabajo en lugar de permitir que todos trabajen en una colección simultánea ), y el OP quiere todos los registros excepto el que coincida con el predicado, por lo que SingleOrDefault devolvería exactamente lo que no quiere. El "método estático" es, de hecho, un método de extensión, como la mayoría de Linq, y funciona siempre que lo que no desea (un elemento o muchos) es más fácil de definir que lo que hace.
KeithS
5
Hay otro enfoque. Utiliza List.FindIndexy List.RemoveAt.
Si bien probablemente usaría la solución presentada por KeithS (solo la simple Where/ ToList), este enfoque difiere en que muta el objeto de lista original. Esto puede ser una buena (o mala) "característica" dependiendo de las expectativas.
En cualquier caso, FindIndex(junto con una protección) garantiza RemoveAtque será correcto si hay huecos en las ID o si el orden es incorrecto, etc., y el uso de RemoveAt(vs Remove) evita una segunda búsqueda O (n) en la lista.
var itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);
resultlist.Items.RemoveAt(1);
?Respuesta corta:
Eliminar (de la lista
results
)results.RemoveAll(r => r.ID == 2);
eliminará el elemento con ID 2 enresults
(en su lugar).Filtro (sin eliminar de la lista original
results
):var filtered = result.Where(f => f.ID != 2);
devuelve todos los artículos excepto el que tiene ID 2Respuesta detallada:
Creo que
.RemoveAll()
es muy flexible, porque puede tener una lista de ID de elementos que desea eliminar; tenga en cuenta el siguiente ejemplo.Si usted tiene:
y asignó algunos valores de la
results
siguiente manera:Luego puede definir una lista de ID para eliminar:
Y simplemente use esto para eliminarlos:
results.RemoveAll(r => removeList.Any(a => a==r.ID));
Será eliminar los elementos 2 y 3 y mantener los elementos 1 y 4 - tal como se especifica por el
removeList
. Tenga en cuenta que esto sucede en su lugar, por lo que no se requiere asignación adicional.Por supuesto, también puede usarlo en elementos individuales como:
donde eliminará Bill con ID 4 en nuestro ejemplo.
DotNetFiddle: ejecute la demostración
fuente
Hay un pequeño ayudante de Linq que me gusta que es fácil de implementar y puede hacer que las consultas con condiciones "donde no" sean un poco más fáciles de leer:
fuente
List.FindIndex
/List.RemoteAt
(que tiene la característica "agradable" o "no tan agradable" de ser una operación mutante).Hay otro enfoque. Utiliza
List.FindIndex
yList.RemoveAt
.Si bien probablemente usaría la solución presentada por KeithS (solo la simple
Where
/ToList
), este enfoque difiere en que muta el objeto de lista original. Esto puede ser una buena (o mala) "característica" dependiendo de las expectativas.En cualquier caso,
FindIndex
(junto con una protección) garantizaRemoveAt
que será correcto si hay huecos en las ID o si el orden es incorrecto, etc., y el uso deRemoveAt
(vsRemove
) evita una segunda búsqueda O (n) en la lista.Aquí hay un fragmento de LINQPad :
Feliz codificación
fuente
No especifica qué tipo de lista, pero la Lista genérica puede usar el
RemoveAt(index)
método o elRemove(obj)
método:fuente
Más simplificado:
no es necesario crear un nuevo objeto var.
fuente
... o simplemente
resultlist.RemoveAt(1)
si sabes exactamente el índice.fuente
fuente