Лучше всего использовать метод «RemoveAll».
Другой распространенный метод:
var itemsToBeDeleted = collection.Where(i=>ShouldBeDeleted(i)).ToList();
foreach(var itemToBeDeleted in itemsToBeDeleted)
collection.Remove(itemToBeDeleted);
Другой распространенный метод - использовать цикл for, но убедитесь, что вы идете * 1006.* backwards :
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);
И когда вы закончите, у вас есть дваколлекции.У нового есть удаленные предметы, старый такой же, как и раньше.