4

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

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

4 回答 4

8

您不能在枚举时修改集合。

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

于 2012-09-09T18:05:16.753 回答
3

改变

foreach (Form form in fc)

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

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

于 2012-09-09T18:02:46.673 回答
1

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

于 2012-09-09T18:02:22.310 回答
0

您的问题是:“我正在通过在迭代表单时关闭其中一个表单来修改打开表单的集合,并在迭代时遇到错误,我正在修改打开表单的集合”。

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

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

  • 查找需要从集合中添加/删除的对象
  • 作用于对象的结果集合

在你的情况下:

var toClose = fc.Where(
   form => form.GetType().FullName.Contains("_MainFrom.Form1"));
toClose.ToList().ForEach(form => {
   form.Hide(); form.Dispose(); 
});
于 2012-09-09T18:03:01.143 回答