-1

まず、コードの最初でArrayListを宣言しpublic ArrayList ArrivalsInApp = new ArrayList();ます。それから、ずっと後に、私はXMLファイルからいくつかのデータをダウンロードしています。「flight」と呼ばれるXmlNodeごとに、パネルを作成しています。

パネルの作成中に、その名前をArrivalsInAppArrayListに追加します。パネルの生成はメソッド内にあります。このメソッドには、いくつかのforeachサイクルとIF条件があります。技術的には、Panelを作成するか(XMLであり、アプリではない場合)、更新するか(両方で)、削除するか(アプリではあるが、XMLではない)を決定します。

このメソッドでは、すべてのフライトの名前をXMLで取得し、ArrayListに保存します。ここでforeachを使用して、アプリケーション内のすべてのフライト(つまり、ArrivalsInApp ArrayList内)がXMLでもあるかどうかを確認します。私はこのコードを使用してこれを行います:

foreach (string y in ArrivalsInApp)
{
if (XmlArrivals.Contains(y) == false)
{
*code*
}
}

「決定」メソッドはform1_loadで呼び出され、タイマーを使用して30秒ごとに呼び出されます。タイマーが指定された値に達したら、XMLをリロードしてから、メソッドを呼び出します。しかし、「コレクションが変更されました。列挙操作が実行されない可能性があります」というコメント付きのInvalidOperationExceptionが発生します。行でforeach (string y in ArrivalsInApp)。私は完全に必死です、私はこれを引き起こす原因がわかりません。

.exeファイルを実行すると(デバッグした場合、タイマーが値に達した後、プログラムがシャットダウンしてこのエラーが表示されます)、パネルは更新または削除する必要があるかどうかに関係なく削除され、未処理の例外エラーがポップアップ表示されます。説明が少し混乱している場合は申し訳ありません。誰かが私にソースファイル全体(おそらくプロジェクト全体)を投稿したい場合は、私に知らせてください。ただし、現在は約1800行のコードがあるため、かなり多くの説明が必要になります。

4

1 に答える 1

1

「コレクションが変更されました。列挙操作が実行されない可能性があります」というコメントとともに InvalidOperationException が発生します。

説明はエラーメッセージにあります。コレクション (この場合は 'ArrivalsInApp') がループ中に変更されました。何かを追加したか、何かを削除しました。

コレクションをループして同時に変更する場合は、最初にコレクションのコピーを取得し、オリジナルを変更しながらコピーをループします。

コピーを作成する最も簡単な方法は、Linq と ToArray() または ToList() を使用することです。

ファイルの先頭に、まだ存在しない場合:

using System.Linq;

次に、 foreach ステートメントで次のようなことができます。

foreach(string y in ArrivalsInApp.ToArray())
{
  // code to do stuff.
}
于 2012-12-30T01:32:06.003 に答える