Il metodo "RemoveAll" è meglio.
Un'altra tecnica comune è:
var itemsToBeDeleted = collection.Where(i=>ShouldBeDeleted(i)).ToList();
foreach(var itemToBeDeleted in itemsToBeDeleted)
collection.Remove(itemToBeDeleted);
Un'altra tecnica comune è quella di utilizzare un ciclo "for", ma assicuratevi di andare all'indietro:
for (int i = collection.Count - 1; i >= 0; --i)
if (ShouldBeDeleted(collection[i]))
collection.RemoveAt(i);
Un'altra tecnica comune è quella di aggiungere gli articoli che sono non vengono rimossi in una nuova raccolta:
var newCollection = new List<whatever>();
foreach(var item in collection.Where(i=>!ShouldBeDeleted(i))
newCollection.Add(item);
e ora avete due collezioni. Una tecnica che mi piace particolarmente se vuoi finire con due raccolte è usare strutture di dati immutabili. Con una struttura dati immutabile, la "rimozione" di un elemento non modifica la struttura dei dati; ti restituisce una nuova struttura dati (che riutilizza i bit dal vecchio, se possibile) che non ha l'oggetto rimosso. Con strutture di dati immutabili che non sta modificando la cosa si sta scorrendo sopra, quindi non c'è nessun problema:
var newCollection = oldCollection;
foreach(var item in oldCollection.Where(i=>ShouldBeDeleted(i))
newCollection = newCollection.Remove(item);
o
var newCollection = ImmutableCollection<whatever>.Empty;
foreach(var item in oldCollection.Where(i=>!ShouldBeDeleted(i))
newCollection = newCollection.Add(item);
E quando hai finito, si dispone di due collezioni. Il nuovo ha gli oggetti rimossi, il vecchio è lo stesso di sempre.
fonte
2012-01-09 16:28:01
possibile duplicato di [Come rimuovere condizionalmente elementi da una collezione NET] (http://stackoverflow.com/questions/653596/how-to-conditionally-remove-items-from-a-net- collezione) –