2012-01-10 56 views
2

「列挙子のインスタンス化後にコレクションが変更されました」というエラーを回避するには、コレクション:列挙子がインスタンス化された後にコレクションが変更された - Request.ServerVariables

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

MSDN exampleを見ると、彼らはその後、GetEnumeratorメソッドまたはMoveNextメソッドを呼び出すことなく、そのコレクションを反復処理、コレクションにサーバー変数を設定します。

つの質問:

  1. なぜ我々はGetEnumeratorメソッドとMoveNextメソッドを呼び出す必要がありますか?
  2. ASP.NETとC#4.0を使用した方が良いアプローチはどれですか?

答えて

6

また、使用することができます。

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

ToListメソッド()拡張メソッドは、新しいリストが作成されます:あなたは何ができるか

string[] keys = Request.ServerVariables.AllKeys; 
foreach(string key in keys) 
{ 
     if(Request.ServerVariables[key] != null) 
     { 
      string value = Request.ServerVariables[key]; 
     } 
} 
+0

これは、次のような他のサイトで言及されているエラーの原因です。http://geekswithblogs.net/congsuco/archive/2006/01/26/67123.aspx – Josh

+0

ivowibloが提案したコードに類似したコードを更新しました。それは、キーの配列を変数にコピーし、次にキーを調べることです。また、ループの開始時と同じように値を保持したい場合は、Request.ServerVariables.CopyToを使用して、キー/値のペアをループの前に別の配列にコピーすることもできます。 –

2

は、サーバー変数から新しいコレクションを作成することですアイテムと一緒に。 ServerVariablesコレクションを変更すると、反復処理中のコレクションは変更されません(新しいもの)。

希望します。

EDIT

はちょうどあなたの質問に答える: 1 - これらの方法は、コレクションを反復処理するためのものです。反復を管理するフレームワークの方法です。反復できる場合は、foreachを使用できます。 2最も良い方法は、foreachを使用することです。これは、列挙型を扱うよりも読みやすいからです。

+0

これはMSDNの記事と同様のアプローチなので、エラーを回避できますか? – Josh

0

データをポストバックするコントロールにEnableViewState="False"を設定すると、"Collection was modified after the enumerator was instantiated."エラーが発生することがあります。

関連する問題