InvalidOperationException не было обработано - почему?

Прежде всего, в начале моего кода я объявляю ArrayList public ArrayList ArrivalsInApp = new ArrayList();, Затем, намного позже, я загружаю некоторые данные из файла XML. Для каждого XmlNode, называемого "рейс", я создаю панель.

При создании панели я добавляю ее имя в ArrivalsInApp ArrayList. Генерация панели в методе. Метод имеет несколько циклов foreach и условий IF. Технически все, что он делает, он решает, нужно ли создавать Panel (если она в XML, а не в приложении), обновлять (в обоих) или удалять (в приложении, но не в XML).

В этом методе я получаю названия всех рейсов в формате XML, сохраняя их в ArrayList. Теперь, используя foreach, я проверяю, все ли полеты в приложении (так в ArrayList ArrivalsInApp) ТАКЖЕ в XML. Я делаю это, используя этот код:

foreach (string y in ArrivalsInApp)
{
if (XmlArrivals.Contains(y) == false)
{
*code*
}
}

Метод "принятия решения" вызывается для form1_load и каждые 30 секунд с использованием таймера. Когда таймер достигает указанного значения, я перезагружаю XML и затем вызываю метод. Но я получаю InvalidOperationException с комментарием, что "Коллекция была изменена; операция перечисления может не выполняться". на линии foreach (string y in ArrivalsInApp), Я в полном отчаянии, я понятия не имею, что вызывает это.

Что происходит, если я запускаю файл.exe (если я просто отлаживаю его, когда таймер достигает значения, программа выключается и показывает эту ошибку), так это то, что Panel удаляется независимо от того, должен ли он быть обновлен или удален, и выскакивает необработанное исключение. Извините, если объяснение немного запутано. Если кто-то захочет, чтобы я опубликовал весь исходный файл (возможно, весь проект), просто дайте мне знать. Тем не менее, поскольку теперь в нем около 1800 строк кода, потребуется немало объяснений.

1 ответ

Решение

Я получаю InvalidOperationException с комментарием о том, что "Коллекция была изменена; операция перечисления может не выполняться".

Объяснение прямо в сообщении об ошибке. Коллекция (в данном случае "ArrivalsInApp") была изменена во время цикла. Либо вы что-то добавили, либо удалили.

Если вы хотите зациклить коллекцию и изменить ее одновременно, то сначала вы должны взять копию коллекции и зациклить копию при изменении оригинала.

Самый простой способ сделать копию - использовать Linq и ToArray() или ToList().

Вверху вашего файла, если он там еще не существует:

using System.Linq;

Затем в отчете foreach вы можете сделать что-то вроде этого:

foreach(string y in ArrivalsInApp.ToArray())
{
  // code to do stuff.
}
Другие вопросы по тегам