Ошибка цикла VB.NET для каждого - PullRequest
0 голосов
/ 20 января 2011

При написании кода для загрузки настроек моего приложения возникла проблема - следующий код выдает InvalidOperationException Ошибка:

For Each c As MapInfo In CurrentMaps
    AddMap(c, False)
Next

Отладчик выделяет часть Next , а со страницы MSDN об ошибке это выглядит так, потому что коллекция ( CurrentMaps ) каким-то образом изменилось с момента последнего столкновения перечислителя (для обработки For Each * ).

Не уверен, почему это произойдет, поскольку AddMap принимает MapInfo ByVal и не касается ввода (поэтому коллекция не изменяется).

Я изменил это на это, которое прекрасно работает:

For i As Integer = 0 To CurrentMaps.Count - 1
    AddMap(CurrentMaps(i), False)
Next

Они должны работать одинаково, верно? Есть идеи, почему For Each one не работает?

Edit:

А, разобрался - проблема в том, что я использую CurrentMaps в качестве временной переменной (коллекция отслеживает текущие карты), а AddMap обычно используется в приложении для добавления новой карты (что означает как обновление пользовательского интерфейса, так и добавление это в CurrentMaps).

Здесь (при загрузке приложения) я просто использую AddMap для обновления пользовательского интерфейса, но дополнительный вызов для добавления элемента в CurrentMaps все еще был там, поэтому он действительно изменял CurrentMaps.

Спасибо за ввод, все!

Ответы [ 4 ]

2 голосов
/ 20 января 2011

Нет, они не должны работать одинаково. По сути, вы не можете изменять коллекцию, пока выполняете ее итерацию, и похоже, что именно это и происходит.

Из List<T>.GetEnumerator() документов:

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

Вы не показали, что делает ваш метод AddMap, но я подозреваю, что он добавляет карту к CurrentMaps, что делает итератор недействительным.

Если бы вы могли дать нам больше информации о точно , что делает AddMap, мы можем помочь вам больше. Что означает False? 1020 *

0 голосов
/ 12 марта 2014
Private Maps as list(of MapInfo)

For each iMaps as MapInfo in CurrentMaps

  Maps.add(iMaps)

Next
0 голосов
/ 20 января 2011

А, разобрался - проблема в том, что я использую CurrentMaps в качестве временной переменной (коллекция отслеживает текущие карты), а AddMap обычно используется в приложении длядобавить новую карту (что означает как обновление пользовательского интерфейса, так и добавление его в CurrentMaps ).

Здесь (при загрузке приложения) я просто использую AddMap для обновленияпользовательский интерфейс, но дополнительный вызов для добавления элемента в CurrentMaps все еще был там, так что он действительно изменял CurrentMaps .

Спасибо за ввод, все!

0 голосов
/ 20 января 2011

Нет, эти функции работают совсем по-другому.Первая версия использует шаблон .Net IEnumerable(Of T) + IEnumerator(Of T).Недопустимо изменять коллекцию, перечисляя ее с помощью этого шаблона.Многие из типов BCL обеспечивают выполнение этого требования.

Второй просто использует шаблон count + index.При условии, что границы остаются правильными, допустимо изменять коллекцию при перечислении с этим шаблоном.

Проблема здесь почти наверняка заключается в том, что AddMap косвенно изменяет коллекцию CurrentMaps и, следовательно, вызывает эту ошибку.

...