Метод «RemoveAll» является лучшим.
Другой распространенный метод:
var itemsToBeDeleted = collection.Where(i=>ShouldBeDeleted(i)).ToList();
foreach(var itemToBeDeleted in itemsToBeDeleted)
collection.Remove(itemToBeDeleted);
Другой распространенный метод заключается в использовании «для» цикла, но убедитесь, что вы идете назад:
for (int i = collection.Count - 1; i >= 0; --i)
if (ShouldBeDeleted(collection[i]))
collection.RemoveAt(i);
Другой распространенный метод заключается в добавлении предметы, которые не удаляются в новую коллекцию:
var newCollection = new List<whatever>();
foreach(var item in collection.Where(i=>!ShouldBeDeleted(i))
newCollection.Add(item);
И теперь у вас есть две коллекции. Техника, которая мне особенно нравится, если вы хотите, чтобы в итоге были созданы две коллекции, - использовать неизменные структуры данных. При неизменной структуре данных «удаление» элемента не изменяет структуру данных; он возвращает вам новую структуру данных (которая, если возможно, повторно использует биты из старой), у которой нет элемента, который вы удалили. При неизменных структурах данных вы не изменяя вещь вы итерацию, так что нет никаких проблем:
var newCollection = oldCollection;
foreach(var item in oldCollection.Where(i=>ShouldBeDeleted(i))
newCollection = newCollection.Remove(item);
или
var newCollection = ImmutableCollection<whatever>.Empty;
foreach(var item in oldCollection.Where(i=>!ShouldBeDeleted(i))
newCollection = newCollection.Add(item);
И когда вы закончите, у вас есть две коллекции. У нового есть элементы, удаленные, старый - тот же, какой он когда-либо был.
возможно дубликат [Как условно удалить элементы из коллекции .NET] (http://stackoverflow.com/questions/653596/how-to-conditionally-remove-items-from-a-net- коллекция) –