2010-07-19 12 views

Respuesta

34

mediante LINQ:

prods.Remove(prods.Single(s => s.ID == 1)); 

Tal vez incluso desea utilizar SingleOrDefault() y comprobar si el elemento existe en absoluto ...

EDITAR:
Dado que stuff es una estructura, SingleOrDefault() no devolverá nulo. Pero volverá por defecto (cosas), lo que tendrá un diámetro interior de 0. Cuando usted no tiene un ID de 0 para sus normales cosas-objetos que se pueden consultar para este ID:

var stuffToRemove = prods.SingleOrDefault(s => s.ID == 1) 
if(stuffToRemove.ID != 0) 
{ 
    prods.Remove(stuffToRemove); 
} 
+0

Bastante seguro Eliminar (nulo) arroja una excepción que descarta SingleOrDefault donde está. –

+1

@Graphain: agregué un ejemplo para usted – tanascius

0

Sólo puede quitar algo que tienen una referencia a. Por lo que tendrá que buscar toda la lista:

stuff r; 
foreach(stuff s in prods) { 
    if(s.ID == 1) { 
     r = s; 
     break; 
    } 
} 
prods.Remove(r); 

o

for(int i = 0; i < prods.Length; i++) { 
    if(prods[i].ID == 1) { 
     prods.RemoveAt(i); 
     break; 
    } 
} 
+0

¿No es más rápido utilizar la función find o findIndex en una lista en lugar de recorrerla? – Rob

+1

No puede modificar la colección que está iterando –

+0

@Rob, para una lista, find debe ser el mismo. –

3

Si tiene LINQ:

var itemtoremove = prods.Where(item => item.ID == 1).First(); 
prods.Remove(itemtoremove) 
+0

Puede poner su consulta 'where' como parámetro en First() –

0

prods.Remove(prods.Single(p=>p.ID == 1));

no se puede modificar en la colección foreach, tal como sugiere Vicente

+0

Single sería más lento que el primero, pero le garantiza que no tiene productos duplicados para el mismo ID que puede sea ​​algo que quiera verificar. –

0

Puede usar Linq.

var prod = from p in prods 
      where p.ID != 1 
      select p; 
+0

Esto no eliminará el objeto. Si asigna como 'prods = prods.Where (p! = 1) .ToList()' está más cerca, pero eso no modificará una lista que se le ha dado como parámetro. –

119

Si el tipo de colección es una List<stuff>, a continuación, el mejor enfoque es probablemente la siguiente:

prods.RemoveAll(s => s.ID == 1) 

Esto sólo lo hace una sola pasada (iteración) sobre la lista, por lo que debe ser más eficiente que otra métodos.

Si su tipo es más genéricamente un ICollection<T>, podría ser útil escribir un método de extensión breve si le interesa el rendimiento. De lo contrario, probablemente se saldrá con la suya usando LINQ (llamando al Where o al Single).

+9

¿Alguien puede marcar esta respuesta como correcta? –

+1

Esta respuesta debe ser aceptada. –

+1

Esta respuesta no se puede aceptar porque IList no tiene RemoveAll. El tema de inicio no especifica lo que él/ella tiene: Lista o IList . –

1
prods.Remove(prods.Find(x => x.ID == 1)); 
Cuestiones relacionadas