收集被修改;枚举操作可能无法执行

时间:2012-09-09 17:59:58

标签: c# .net windows

我收到错误:收集已修改;枚举操作可能无法执行。我试图删除除当前之外的所有打开的表单对象:

    FormCollection fc = Application.OpenForms;
    foreach (Form form in fc)
    {
        if (form.ToString().Contains("_MainFrom.Form1"))
        {
            // Do nothing
        }
        else
        {
            form.Hide();
            form.Dispose();
        }
    }

4 个答案:

答案 0 :(得分:7)

您无法修改枚举的集合。

使用foreach (Form form in fc.Cast<Form>().ToList())

答案 1 :(得分:2)

更改

foreach (Form form in fc)

foreach (Form form in fc.OfType<Form>().ToList())

这样您就可以在开始从原始集合中删除内容之前将OpenForms集合复制到新集合。

答案 2 :(得分:1)

您无法修改执行枚举的集合(例如foreach)。您应该在这里使用其他方法,例如Remove或使用for循环。

答案 3 :(得分:0)

你的问题是:“我正在修改Open表单的集合,方法是在迭代表单时关闭其中一个表单,并在迭代时收到我正在修改Open表单集合的错误。”

答案:要么不使用foreach迭代,要么在迭代期间不修改集合。否则他们会发现。

最常见的方法是将此类操作分为两个步骤:

  • 查找需要从集合中添加/删除的对象
  • 对最终的对象集合采取行动

在你的情况下:

var toClose = fc.Where(
   form => form.GetType().FullName.Contains("_MainFrom.Form1"));
toClose.ToList().ForEach(form => {
   form.Hide(); form.Dispose(); 
});