У меня есть классический случай попытки удалить элемент из коллекции, перечислив его в цикле:
List<int> myIntCollection = new List<int>();
myIntCollection.Add(42);
myIntCollection.Add(12);
myIntCollection.Add(96);
myIntCollection.Add(25);
foreach (int i in myIntCollection)
{
if (i == 42)
myIntCollection.Remove(96); // The error is here.
if (i == 25)
myIntCollection.Remove(42); // The error is here.
}
В начале итерации после изменения происходит выброс InvalidOperationException
, поскольку перечисления не нравятся, когда меняется базовая коллекция.
Мне нужно внести изменения в сборку во время итерации. Существует много шаблонов , которые можно использовать, чтобы избежать этого, но ни один из них не имеет хорошего решения:
-
Не удаляйте внутри этого цикла, вместо этого сохраняйте отдельный "Список исключений", который вы обрабатываете после основного цикла.
Это, как правило, хорошее решение, но в моем случае мне нужно, чтобы элемент был немедленно удален как "ожидание" до основной цикл, чтобы действительно удалить элемент, меняет логический поток моего кода.
-
Вместо удаления элемента просто установите флаг в элементе и пометьте его как неактивный. Затем добавьте функциональность шаблона 1, чтобы очистить список.
Это будет работать для всех моих потребностей, но это означает, что много кода придется менять, чтобы проверять неактивный флаг каждый раз, когда к объекту обращаются. Для меня это слишком много администрирования.
-
Как-то включить идеи шаблона 2 в класс, который вытекает из
List<T>
. Этот Superlist будет обрабатывать неактивный флаг, удаление объектов после факта, а также не будет выставлять элементы, помеченные как неактивные для пользователей перечисления. В принципе, он просто инкапсулирует все идеи шаблона 2 (а затем шаблон 1).Существует ли такой класс? У кого-нибудь есть код для этого? Или есть лучший способ?
-
Мне сказали, что доступ к
myIntCollection.ToArray()
вместоmyIntCollection
решит проблему и позволит мне удалить внутри цикла.Это кажется плохим шаблоном дизайна для меня или, может быть, его прекрасным?
Подробнее:
-
Список будет содержать много элементов, и я удалю только некоторые из них.
-
Внутри цикла я буду делать всевозможные процессы, добавлять, удалять и т.д., поэтому решение должно быть довольно общим.
-
Элемент, который мне нужно удалить, может не быть текущим элементом цикла. Например, я могу быть на позиции 10 из 30 циклов элементов и должен удалить элемент 6 или элемент 26. Прохождение назад через массив больше не будет работать из-за этого.; О (