Как лучше исправить foreach цикл, внутри которого расширяется перебираемая коллекция?

Рейтинг: 5Ответов: 1Опубликовано: 17.03.2015

Коллекция выглядит так:

public class myList : List<myClass> { }

Мне нужно повторять цикл до тех пор, пока он добавляет новые элементы:

do {
    newObjectAdded = false;
    foreach (myClass obj in myList) {
        //...
        if (some_condition) {
            myList.Add(newObj); 
            newObjectAdded = true;}
        //...
    }
} while (newObjectAdded);

После того, как в лист добавится элемент, в строке foreach (myClass obj in myList) я получаю ошибку - коллекция была изменена, невозможно выполнить операцию перечисления.

Можно заменить foreach на цикл с итератором, но от этого обращение к объектам станет довольно громоздким. Ещё есть вариант с заменой списка на LinkedList, но это ещё хуже, в данном случае.

Существует ли какой-то более элегантный способ?

Ответы

▲ 7Принят

Сам разобрался. Достаточно написать:

foreach (myClass obj in myList.ToArray()) {