Иногда программисту хочется чего-то удалить из коллекции. Например строку из коллекции строк DataTable. Он радостно пишет что-то в духе:
// на этом месте могла бы быть ваша реклама... то есть любая коллекция foreach (DataRow currRow in _someDataTable.Rows) { if (/*условие для удаления*/) { someDataTable.Rows.Remove(currRow); } }
и получает жестокий облом в виде ошибки с невнятным сообщением "Collection was modified; enumeration operation might not execute".
Суть происходящего в том, что оператор foreach не может работать, если внутри него меняется та последовательность, которую он обходит. Возможные варианты:
- Если мы работаем с DataTable, то можем воспользоваться специальными методом Delete (он только помечает строки, которые надо удалить) и AcceptChanges()
- Использовать оператор for, обходя коллекцию с конца
- Занести нужные строки в отдельную коллекцию и удалить позже
- Использовать List
и RemoveAll с условием - Использовать LinQ и ForEach
currRow.Delete(); // чуть позже someDataTable.AcceptChanges();
for(int i = someDataTable.Rows.Count - 1; i >= 0; i--) { /* код удаления */ }
Дополнительно:
Добрый день,
Спасибо за исчерпывающий и точный ответ. Очень помогло при удалении элементов Списка SharePoint 2010 - обратный цикл.
Спасибо,
С уважением,
Андрей
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!