2012-04-19 17 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'自体がnullではないと思いますか?この問題を実証している短くて完全なプログラムは本当に助けになるでしょう... –

0

あなたはそれに反復中ACTIONLISTを変更しました。それは、現在のループまたは変更または他の反復を行うアクションメソッドと同期していない第2のスレッドであってもよい。

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

しかし、アクションの変更の場合にのみ、パラレルスレッドの場合にのみ動作します。リストを同期する必要があります。

+0

Skeets Answer => NullRefException – Pascal

+0

Skeetsが答えを投稿している間に私が書いたことは分かりますがマルチスレッド環境で問題が発生する可能性があることも指摘されています。 – AlexTheo