Я пытаюсь написать метод расширения в .NET, который будет работать с общей коллекцией и удалить все элементы из коллекции, соответствующие заданным критериям.Как условно удалить элементы из коллекции .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);
}
Это проливает же исключение; Я не уверен, что я действительно понимаю, почему, поскольку «Свод» больше не перебирается, поэтому почему он не может быть изменен?
Если у кого-то есть предложения относительно того, как я могу заставить это работать, или лучший способ достичь того же, это было бы здорово.
Спасибо.
Что коллекции вы тестирования их на? Поскольку только вы, кажется, получаете исключения во втором, ваша коллекция может даже не поддерживать Remove ... –
Ешьте выдержку из единичного теста, который не работает при использовании этого метода, где «mockStaff» является ранее существующим списком. Персонал newStaff = новый Персонал {StaffId = 5}; mockStaff.Add (newStaff); mockStaff.RemoveWhere (s => s.StaffId == 5); // Неверное действие, исключенное здесь. –
Ли: Что-то еще должно продолжаться. См. Мой ответ для примера. –