Оба из уже представленных ответов верны, но не приводим объяснение, почему пример кода автора не работает.Пара интересных моментов:
Во-первых, RemoveAll()
не определен в интерфейсе ICollection
или ICollection<T>
;например, он определен в List<T>
, но семантически эквивалентный метод в HashSet<T>
называется RemoveWhere()
.Если вы хотите сделать это для любого ICollection<T>
, вы должны написать метод расширения.
Во-вторых, пример кода вопроса передает последовательность элементов, которые должны быть удалены из коллекции, но List<T>.RemoveAll()
и HashSet<T>.RemoveWhere()
взять предикат для определения элементов, которые будут удалены (как показано в других ответах).Вы можете написать свой метод расширения, чтобы использовать другой подход, и передать IEnumerable<T>
, как в вашем примере.Вы должны быть осторожны, потому что вы не можете сделать это:
foreach (var item in collection)
if (ShouldRemove(item))
collection.Remove(item);
Если вы попытаетесь это сделать, вы должны получить InvalidInvalidOperationException с сообщением типа «Коллекция была изменена; операция перечисления может не выполнятьсявыполнить. "