2014-11-28 15 views
7

Ho una lista contenente alcuni oggetti e voglio usare LINQ per rimuovere un elemento specifico ma non sono sicuro di come farlo.Rimuovere un elemento specifico da un elenco utilizzando LINQ

foreach (var someobject in objectList) 
{ 
    if (someobject.Number == 1) // There will only one item where Number == 1. 
    { 
     list.remove(someobject) 
    } 
} 
+2

Quindi, il codice non funziona o cosa? –

+0

Contrariamente a quanto si sostiene, il codice corrente non coinvolge affatto LINQ. Avete motivi specifici per volere/avere bisogno di una soluzione basata su LINQ? Oppure sarebbe accettabile qualsiasi altra soluzione efficiente? – stakx

+1

@VsevolodGoloviznin: Il codice sopra riportato non può funzionare, perché contiene errori di sintassi - 'list.remove (someobject)'. – stakx

risposta

27

È cannot use a foreach to remove items durante l'enumerazione, che stai ricevendo un'eccezione in fase di esecuzione.

Si potrebbe utilizzare List.RemoveAll:

list.RemoveAll(x => x.Number == 1); 

o, se si tratta di realtà non un List<T> ma qualsiasi sequenza, LINQ:

list = list.Where(x => x.Number != 1).ToList(); 

Se si è certi che non v'è un solo elemento con quel numero o si desidera rimuovere un elemento al massimo è possibile utilizzare l'approccio ciclo for suggerito nell'altra risposta o questa:

var item = list.FirstOrDefault(x => x.Number == 1); 
if(item ! = null) list.Remove(item); 

Il collegamento all'altra domanda che ho pubblicato suggerisce che è possibile modificare una raccolta durante l'enumerazione in C# 4 e successive. No, non puoi. That applies only to the new concurrent collections.

+2

In questo caso si potrebbe effettivamente utilizzare un foreach poiché c'è solo un elemento da rimuovere. Assicurati di usare break per uscire dal ciclo dopo che l'elemento è stato rimosso, altrimenti otterrai un'eccezione nella successiva iterazione. Detto questo, penso che la soluzione con RemoveAll() sia più elegante. – haagel

2

Non è possibile utilizzare foreach per rimuovere l'elemento dalla raccolta. Questo genererà un'eccezione che la collezione è stata modificata.

È possibile eseguire con per

for (int i=objectList.Count-1; i>=0 ; i--) 
{ 
    if (objectList[i].Number == 1) // there will only one item with Number = 1 
    { 
     objectList.Remove(objectList[i]); 
    } 
} 

Altro caso è quello di utilizzare Remove/RemoveAll come Tim Schmelter spettacolo.

+0

Come indicato altrove, se sei felice di rompere dopo aver trovato una corrispondenza, non c'è motivo di cambiare il ciclo 'foreach' in un ciclo' for'. – Rawling

+1

@Rawling un altro tizio ha aggiunto la frase break. Ad ogni modo, la risposta all'inizio non andava bene. – mybirthname

-1

è possibile rimuovere l'indice se il valore soddisfa i criteri

for (int i=0; i < objectList.Count; i ++) 
{ 
    if (objectList[i].Number == 1) // there will only one item with Number = 1 
    { 
     objectList.RemoveAt[i]; 
    } 
} 
1

È possibile utilizzare un ciclo foreach per rimuovere un elemento da un elenco. L'importante è usare break per fermare il loop dopo aver rimosso l'oggetto. Se il ciclo continua dopo la rimozione di un elemento dall'elenco, verrà generata un'eccezione.

foreach (var someobject in objectList) 
{ 
    if (someobject.Number == 1) // There will only one item where Number == 1 
    { 
     objectList.remove(someobject); 
     break; 
    } 
} 

Tuttavia, questo sarà solo funziona se c'è un solo oggetto che si desidera rimuovere, come nel tuo caso.

Problemi correlati