2012-04-04 21 views
96

He una lista almacenada en resultList de la siguiente manera:C# - ¿Cómo eliminar un elemento de la lista?

var resultlist = results.ToList(); 

se ve algo como esto

ID FirstName LastName 
-- --------- -------- 
1 Bill  Smith 
2 John  Wilson 
3 Doug  Berg 

¿Cómo se quita ID 2 de la lista?

Respuesta

188

List<T> tiene dos métodos que puede utilizar.

RemoveAt(int index) puede usarse si conoce el índice del artículo. Por ejemplo:

resultlist.RemoveAt(1); 

o puede utilizar Remove(T item):

var itemToRemove = resultlist.Single(r => r.Id == 2); 
resultList.Remove(itemToRemove); 

Cuando no está seguro el elemento existe realmente puede utilizar SingleOrDefault. SingleOrDefault devolverá null si no hay ningún artículo (Single arrojará una excepción cuando no pueda encontrar el artículo). Ambos 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); 
+3

bien, que quizás 'var itemsToRemove = resultlist.Where (r => r.Id == 2); foreach (var itemToRemove en ItemsToRemove) resultList.Remove (itemToRemove); ' – Vlad

+0

¿No debería ser esto' resultlist.Items.RemoveAt (1); '? – Obsidian

29
resultList = results.Where(x=>x.Id != 2).ToList(); 

Hay un pequeño ayudante LINQ me gusta eso es fácil de implementar y puede realizar consultas con "cuando no" condiciones un poco más fácil de leer:

public static IEnumerable<T> ExceptWhere<T>(this IEnumerable<T> source, Predicate<T> predicate) 
{ 
    return source.Where(x=>!predicate(x)); 
} 

//usage in above situation 
resultList = results.ExceptWhere(x=>x.Id == 2).ToList(); 
+1

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 de mutación). –

+0

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 cree que es necesario. * Por lo general *, la eliminación es una mutación en contexto de la matriz existente. – KeithS

+0

Esto no es seguro para subprocesos, y por su simplicidad solo puede usar SingleOrDefault, no necesita estar contenido en un método estático –

0

... o simplemente resultlist.RemoveAt(1) si saben exactamente el índice.

+2

solo si está ordenado por 'ID'. – zzzzBov

3

No se especifica qué tipo de lista, pero la lista genérica, puede utilizar el método de RemoveAt(index), o el método de Remove(obj):

// Remove(obj) 
var item = resultList.Single(x => x.Id == 2); 
resultList.Remove(item); 

// RemoveAt(index) 
resultList.RemoveAt(1); 
4

Hay otro enfoque. Utiliza List.FindIndex y List.RemoveAt.

Aunque me probablemente utilizar la solución presentada por Keith (sólo la simple Where/ToList) este enfoque se diferencia en que muta el objeto lista original. Esta puede ser una "característica" buena (o mala) según las expectativas.

En cualquier caso, el FindIndex (junto con un guardia) asegura la RemoveAt serán correctas si hay lagunas en los ID o el orden es incorrecto, etc, y el uso de RemoveAt (vs Remove) evita un segundo O (n) buscar a través de la lista.

Aquí hay un fragmento LINQPad:

var list = new List<int> { 1, 3, 2 }; 
var index = list.FindIndex(i => i == 2); // like Where/Single 
if (index >= 0) { // ensure item found 
    list.RemoveAt(index); 
} 
list.Dump();  // results -> 1, 3 

feliz de codificación.

8

Respuesta corta:
results.RemoveAll(r => r.ID==2); eliminará el elemento con ID 2 en results (en su lugar).

respuesta detallada:

Creo que es más fácil de usar .RemoveAll(), porque se puede tener una lista de ID de elemento que desea quitar - por favor considera el siguiente ejemplo.

si tiene:

class myClass { 
    public int ID; public string FirstName; public string LastName; 
} 

y asignado algunos valores a results de la siguiente manera:

var results=new List<myClass> { 
    new myClass() { ID=1, FirstName="Bill", LastName="Smith" }, 
    new myClass() { ID=2, FirstName="John", LastName="Wilson" }, 
    new myClass() { ID=3, FirstName="Doug", LastName="Berg" }, 
    new myClass() { ID=4, FirstName="Bill", LastName="Wilson" }, 
}; 

A continuación, se puede definir una lista de ID para eliminar:

var removeList = new List<int>() { 2, 3 }; 

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. Nota que esto sucede en su lugar, por lo que no se requiere ninguna asignación adicional.

Por supuesto, también se puede utilizar en artículos individuales como:

results.RemoveAll(r => r.ID==4); 

donde se eliminará Bill con el ID 4 en nuestro ejemplo.


DotNetFiddle: Run the demo

2

más simplificada:

resultList.Remove(resultList.Single(x => x.Id == 2)); 

no hay necesidad de crear un nuevo objeto var.

Cuestiones relacionadas