Я пытаюсь написать метод расширения в .NET, который будет работать с общей коллекцией и удалить все элементы из коллекции, соответствующие заданным критериям.
Это была моя первая попытка:
public static void RemoveWhere<T>(this ICollection<T> Coll, Func<T, bool> Criteria){
foreach (T obj in Coll.Where(Criteria))
Coll.Remove(obj);
}
Однако это вызывает исключение InvalidOperationException, "коллекция была изменена, операция перечисления не может выполняться". Что имеет смысл, поэтому я сделал вторую попытку со второй переменной коллекции, чтобы удерживать элементы, которые нужно удалить, и перебирать их вместо этого:
public static void RemoveWhere<T>(this ICollection<T> Coll, Func<T, bool> Criteria){
List<T> forRemoval = Coll.Where(Criteria).ToList();
foreach (T obj in forRemoval)
Coll.Remove(obj);
}
Это вызывает одно и то же исключение; Я не уверен, что я действительно понимаю, почему, поскольку "Coll" больше не перебирается, поэтому почему его нельзя изменить?
Если у кого-то есть предложения относительно того, как я могу заставить это работать, или лучший способ добиться того же, это было бы здорово.
Спасибо.