2012-01-10 44 views
2

爲了避免錯誤「集合在枚舉器被實例化後被修改」 我發現了許多建議,以便在通過Request.ServerVariables.Keys循環之前使用以下行收藏:集合在枚舉器實例化後被修改 - Request.ServerVariables

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

望着MSDN example,他們設置了服務器變量的集合,然後通過該集合迭代,而不調用的GetEnumerator和MoveNext的。

兩個問題:

  1. 爲什麼我們需要調用的GetEnumerator和MoveNext的?
  2. 如果使用ASP.NET和C#4.0,哪種方法更好?

回答

6

您還可以使用:

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 2012-01-10 14:48:09

+0

我已經更新了類似於ivowiblo建議的代碼,即將鍵數組複製到一個變量,然後查看鍵。如果您想保留循環開始時的值,您也可以使用Request.ServerVariables.CopyTo在循環之前將鍵/值對複製到不同的數組中。 – 2012-01-10 14:53:09

2

你可以做的是從服務器創建變量一個新的集合:

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

ToList()擴展方法將創建一個新的列表與項目。如果你改變了ServerVariables集合,你將不會改變你正在迭代的集合(因爲它是一個新集合)。

希望它有幫助。

編輯

只是回答您的問題: 1-那些方法是遍歷集合。是管理迭代的框架方式。如果你可以迭代,你可以使用foreach。最好的方法是使用foreach,因爲它比使用枚舉更具可讀性。

+0

所以這可以避免錯誤,因爲它是MSDN文章採用的類似方法? – Josh 2012-01-10 14:50:15

0

當您爲回發數據的控件設置EnableViewState="False"時,可能會出現"Collection was modified after the enumerator was instantiated."錯誤。

相關問題