El método "RemoveAll" es el mejor.
Otra técnica común es:
var itemsToBeDeleted = collection.Where(i=>ShouldBeDeleted(i)).ToList();
foreach(var itemToBeDeleted in itemsToBeDeleted)
collection.Remove(itemToBeDeleted);
Otra técnica común es utilizar un bucle "for", pero asegúrese de ir hacia atrás:
for (int i = collection.Count - 1; i >= 0; --i)
if (ShouldBeDeleted(collection[i]))
collection.RemoveAt(i);
Otra técnica común es añadir los artículos que son no que se están quitando a una nueva colección:
var newCollection = new List<whatever>();
foreach(var item in collection.Where(i=>!ShouldBeDeleted(i))
newCollection.Add(item);
Y ahora tiene dos colecciones. Una técnica que me gusta particularmente si quieres terminar con dos colecciones es usar estructuras de datos inmutables. Con una estructura de datos inmutable, "eliminar" un elemento no cambia la estructura de datos; le devuelve una nueva estructura de datos (que reutiliza bits del anterior, si es posible) que no tiene el elemento que eliminó. Con estructuras de datos inmutables que no está modificando lo que estás interactuando sobre, así que no hay 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);
Y cuando haya terminado, usted tiene dos colecciones. El nuevo tiene los elementos eliminados, el anterior es el mismo que nunca.
posible duplicado de [Cómo eliminar condicionalmente artículos de una colección .NET] (http://stackoverflow.com/questions/653596/how-to-conditionally-remove-items-from-a-net- colección) –