枚举器实例化后修改了集合--Request.ServerVariables

时间:2012-01-10 14:31:42

标签: c# asp.net c#-4.0

避免错误“在枚举器实例化后修改了集合” 在循环访问Request.ServerVariables.Keys集合之前,我发现了一些使用以下行的建议:

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

查看MSDN example,他们将服务器变量设置为集合,然后在不调用GetEnumerator或MoveNext的情况下遍历该集合。

两个问题:

  1. 为什么我们需要调用GetEnumerator和MoveNext?
  2. 如果使用ASP.NET和C#4.0,哪种方法更好?

3 个答案:

答案 0 :(得分:6)

您也可以使用:

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

答案 1 :(得分:2)

您可以做的是从服务器变量创建一个新集合:

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

ToList()扩展方法将使用这些项创建一个新的List。如果更改ServerVariables集合,则不会更改正在迭代的集合(因为它是一个新集合)。

希望它有所帮助。

修改

回答你的问题: 1-这些方法用于迭代集合。是管理迭代的框架方式。如果你可以迭代,你可以使用foreach。 2-最好的方法是使用foreach,因为它比使用enumerables更具可读性。

答案 2 :(得分:0)

当您为回发数据的控件设置"Collection was modified after the enumerator was instantiated."时,您可能会收到EnableViewState="False"错误。