Коллекция была изменена после создания экземпляра перечислителя - Request.ServerVariables - PullRequest
2 голосов
/ 10 января 2012

Чтобы избежать ошибки "Коллекция была изменена после создания экземпляра перечислителя" Я нашел несколько рекомендаций по использованию следующих строк перед циклом просмотра коллекции Request.ServerVariables.Keys:

IEnumerator en = Request.ServerVariables.Keys.GetEnumerator();
en.MoveNext();

Глядя на пример MSDN , они устанавливают переменные сервера в коллекцию, а затем выполняют итерацию по этой коллекции, не вызывая GetEnumerator или MoveNext.

Два вопроса:

  1. Зачем нам вызывать GetEnumerator и MoveNext?
  2. Какой подход лучше при использовании ASP.NET и C # 4.0?

Ответы [ 3 ]

6 голосов
/ 10 января 2012

Вы также можете использовать:

 string[] keys = Request.ServerVariables.AllKeys;
 foreach(string key in keys )
 {
      if(Request.ServerVariables[key] != null)
      {
           string value = Request.ServerVariables[key];
      }
 }
2 голосов
/ 10 января 2012

Что вы можете сделать, это создать новую коллекцию из переменных сервера:

foreach(var key in Request.ServerVariables.AllKeys.ToList())
{
    var value = Request.ServerVariables[key];
    ...
}

Метод расширения ToList () создаст новый список с элементами.Если вы измените коллекцию ServerVariables, вы не будете изменять коллекцию, которую вы повторяете (поскольку она новая).

Надеюсь, это поможет.*

Просто отвечаю на ваши вопросы: 1- Эти методы предназначены для итерации коллекции.Это базовый способ управления итерацией.Если вы можете повторять, вы можете использовать foreach.2- Лучший способ - использовать foreach, так как он более читабелен, чем работа с перечислимыми.

0 голосов
/ 08 августа 2012

Вы можете получить ошибку "Collection was modified after the enumerator was instantiated.", если вы установите EnableViewState="False" для элементов управления, которые отправляют данные обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...