2012-04-19 3 views
1

Возможный дубликат:
Collection was modified; enumeration operation may not executeКоллекция была изменена во время перечисления

У меня есть общий список, где я выполнить некоторые действия при перечислении.

foreach(Action<string> action in actionList) 
{ 
    if(action != null) { 
     action(mystring); 
    } 
} 

Теперь я получаю это исключение:

InvalidOperationException: 
Collection was modified; enumeration operation may not execute 

Как это может быть решена, я прибил плотно к .NET 3.5/

+1

Отметьте столбец «Соответствующий» в правой части страницы, есть огромное количество одинаковых вопросов. –

ответ

6

Ну предположительно, один из действий изменяет actionList, недействительности итератор. Самый простой способ избежать ошибки - сначала взять копию списка, например.

foreach(Action<string> action in actionList.ToList()) 
{ 
    if(action != null) { 
     action(mystring);        
    } 
} 

Или даже:

foreach (var action in actionList.Where(action => action != null).ToList()) 
{ 
    action(mystring); 
} 
+0

+1. ответ менее чем за 1 минуту :) – Reniuz

+0

Я пробовал свой первый фрагмент кода, который генерирует NullRefException :( – Pascal

+0

@Pascal: Не следует ... где он выбрал исключение? Я предполагаю, что 'actionList' сам не равен нулю? короткая, но полная программа, демонстрирующая проблему, действительно помогла бы ... –

0

Вы изменили ActionList во время итерации на нем. Это может быть второй поток, который не синхронизируется с текущим циклом или методом действия, которые делают модификацию или другую итерацию. Таким образом, решение может быть:

var tmp = new List<Action<string> >(actionList); 
foreach(Action<string> action in tmp) 
{ 
    if(action != null) { 
     action(mystring);        
    } 
} 

Но это будет работать только в случае внесения изменений ACTION в случае параллельной резьбы следует синхронизировать список.

+0

то же, что и Skeets answer => NullRefException – Pascal

+0

Я знаю, что написал это, в то время как Skeets отправил свой ответ , так что я должен удалить его? Также упоминается, что проблема может возникнуть в многопоточной среде. – AlexTheo

Смежные вопросы