InvalidOperationExceptionが発生しました。「コレクションが変更されました。列挙操作の可能性があります。
これは【C#チュートリアルのシリーズ28回目】です。役に立つと感じたら、自由にコラムをフォローしてください。
I: 問題の説明
foreachでリストに対してAddやRemoveの操作を行う場合、以下のようなコードになります。
class Program
{
static List
nameList = new List
();
static void Main(string[] args)
{
nameList.Add("SuWake");
nameList.Add("AllenSu");
foreach (var name in nameList)
{
nameList.Add("QingYuNian"); // add
nameList.RemoveAt(0); // remove
}
Console.ReadKey();
}
}
以下のようなエラーが報告されます。
II: ソリューション
次のコードのように、foreachをforループに変更するだけです。
for (int i = 0; i < nameList.Count; i++)
{
nameList.Add("QingYuNian");
nameList.RemoveAt(0);
}
III:なぜそうなるのか
参考1.
foreachは内部でIteratorを使用しているため、内部コードではまずhasNextかどうかを判断し、次にnextを呼び出しますが、この2つの関数が問題の原因となっています。
参考2.
foreach を使用してリストまたは辞書を検索する場合、Add または Remove 操作を実行するか、項目プロパティに値を代入すると、このエラーが発生します。
返された IEnumerator は現在のプロパティを読み取り専用として公開するため、それを変更すると実行時エラーになります。
特殊なケース
foreachで一括して追加や削除の操作を行った場合はこのエラーが発生しますが、最初の要素のみに対して操作を行い、操作後にブレークした場合は発生しません。
たとえば、ここでは、foreachで追加操作を行い、その時点でブレークしてリストの要素数を表示しています。
static void Main(string[] args)
{
nameList.Add("SuWake");
nameList.Add("AllenSu");
foreach (var name in nameList)
{
nameList.Add("QingYuNian");
break;
}
Console.Write(nameList.Count);
Console.ReadKey();
}
コンソールを実行すると、次のような結果が得られます。
しかし、実際には誰もループの中で操作を行わないので、ここではそのようなテストになっています。
あなたの問題は解決しましたか?コメント欄に気軽にコメントを残してください。
記事が良いと思ったら、ワンクリック3連発をして頂けると幸いです、ありがとうございます。
<ブロッククオート
<センター 結論 <センター
技術は少しずつ積み重ねていくもので、神々には一日にして成らず。じっとしていると後退してしまうので、毎日少しずつ良くしていきましょう。最後に、座右の銘として「善は急げ、忍びは急げ」を掲げました。
関連
-
Unityがエラーを報告します。コレクションが変更されました。列挙操作が実行されない可能性があります。
-
HTTP エラー 500.22 - 内部サーバー エラー-IIS7 Asp.net2.0 ウェブサイトの実行ソリューションに失敗しました。
-
C# データベース操作エラー。この接続に関連付けられた開いているDataReaderがすでにあり、これを閉じる必要があります...
-
Javascriptインジェクション攻撃
-
ConfigurationManager.OpenExeConfigurationで設定ファイルを読み込む
-
c#App.config,ConfigurationManager の読み込みと書き込み。
-
ファイルまたはアセンブリ "Oracle "の読み込みに失敗しました。
-
HeaderCellに行番号を表示するC# DataGridViewメソッド
-
c# で datagridview の行の高さを設定する
-
C# DataGridView グループ化できるセルを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C#の面接質問100選(.net開発者必見)
-
不正なフォーマットでプログラムを読み込もうとした場合の問題を解決します。
-
インデックスが配列の範囲外であった。
-
C#のExcelエクスポートでHRESULT:0x800A03ECが発生する例外を解決する方法
-
C#の構文]をご覧ください。C#のリフレクション(アセンブリ)機構を説明する
-
HTTPエラー500.30 - ANCMインプロセス開始失敗の解決策
-
asp.netで現在のurlを取得する方法
-
CS0120 非静的フィールド、メソッド、またはプロパティにオブジェクト参照が必要です XX
-
System.DllNotFoundException 問題分析と解決策
-
GetProperty リフレクションの代入 SetValue エラーです。System.Byte "型のオブジェクトは "System.Nullable`1[System.Int32]"型に変換することができません。Int32]」に変換できません。