Ошибка Collection was modified; enumeration operation might not execute

Иногда программисту хочется чего-то удалить из коллекции. Например строку из коллекции строк DataTable. Он радостно пишет что-то в духе:

// на этом месте могла бы быть ваша реклама... то есть любая коллекция
foreach (DataRow currRow in _someDataTable.Rows)
{
    if (/*условие для удаления*/)
    {
        someDataTable.Rows.Remove(currRow);
    }
}

и получает жестокий облом в виде ошибки с невнятным сообщением "Collection was modified; enumeration operation might not execute".

Суть происходящего в том, что оператор foreach не может работать, если внутри него меняется та последовательность, которую он обходит. Возможные варианты:

  1. Если мы работаем с DataTable, то можем воспользоваться специальными методом Delete (он только помечает строки, которые надо удалить) и AcceptChanges()
  2. currRow.Delete();
    // чуть позже 
    someDataTable.AcceptChanges();
    
  3. Использовать оператор for, обходя коллекцию с конца
  4. for(int i = someDataTable.Rows.Count - 1; i >= 0; i--) { /* код удаления */ } 
  5. Занести нужные строки в отдельную коллекцию и удалить позже
  6. Использовать List и RemoveAll с условием
  7. Использовать LinQ и ForEach

Дополнительно:


Комментарии

Ошибка Collection was modified; enumeration operation might not execute — Комментарии (2)

  1. Добрый день,

    Спасибо за исчерпывающий и точный ответ. Очень помогло при удалении элементов Списка SharePoint 2010 - обратный цикл.

    Спасибо,
    С уважением,
    Андрей

  2. Hey Jerry, is it just me or does anyone else think the leak is coming from a certain AD who should be sent packing back to the mid-major school he came from? There is no way this gets leaked unless it&182#7;s an inside job!

Добавить комментарий для Андрей Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>