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反復を使用しないか、反復中にコレクションを変更しないでください。そうでなければ、彼らは見つけるでしょう。

最も一般的なアプローチは、そのような操作を 2 つのステップに分割することです。

  • コレクションに追加/コレクションから削除する必要があるオブジェクトを見つける
  • 結果のオブジェクトのコレクションに作用する

あなたの場合:

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 に答える