【问题标题】:Collection was modified after the enumerator was instantiated - Request.ServerVariables枚举器实例化后修改集合 - Request.ServerVariables
【发布时间】:2012-02-06 23:00:45
【问题描述】:

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

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

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

两个问题:

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

【问题讨论】:

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


    【解决方案1】:

    你也可以使用:

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

    【讨论】:

    • 这就是导致其他网站上提到的错误的原因,例如:geekswithblogs.net/congsuco/archive/2006/01/26/67123.aspx
    • 我已经更新了类似于 ivowiblo 建议的代码,即将键数组复制到变量,然后查看键。如果您想保留循环开始时的值,还可以使用 Request.ServerVariables.CopyTo 在循环之前将键/值对复制到不同的数组。
    【解决方案2】:

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

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

    ToList() 扩展方法将创建一个包含项目的新列表。如果您更改 ServerVariables 集合,您将不会更改您正在迭代的集合(因为它是一个新集合)。

    希望对你有帮助。

    编辑

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

    【讨论】:

    • 所以这样可以避免错误,因为它是 MSDN 文章采用的类似方法?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      相关资源
      最近更新 更多