[解決済み] なぜList<T>.ForEachはリストの変更を許可するのですか?
2023-04-17 05:35:15
質問
を使用する場合。
var strings = new List<string> { "sample" };
foreach (string s in strings)
{
Console.WriteLine(s);
strings.Add(s + "!");
}
その
Add
の中に
foreach
は InvalidOperationException (Collection was modified; enumeration operation may not execute) をスローしますが、これは足元からラグを引っ張っているため、論理的だと考えています。
しかし、私が使用すると
var strings = new List<string> { "sample" };
strings.ForEach(s =>
{
Console.WriteLine(s);
strings.Add(s + "!");
});
を実行すると、すぐに OutOfMemoryException を投げるまでループして、自分自身の足を撃ってしまいます。
私はいつも、List.ForEach は単に、List.ForEach のラッパーだと考えていたので、これは私にとって驚きです。
foreach
または
for
.
どなたか、この動作の方法と理由を説明できる方はいらっしゃいませんか?
(インスパイアード・バイ Generic ListのForEachループが延々と繰り返される )
どのように解決するのですか?
それは
ForEach
メソッドは列挙子を使用せず、項目をループして
for
ループを使用します。
public void ForEach(Action<T> action)
{
if (action == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
for (int i = 0; i < this._size; i++)
{
action(this._items[i]);
}
}
(JustDecompileで取得したコード)
列挙子は使われないので、リストが変更されたかどうかをチェックすることはなく、終了条件の
for
ループの終了条件に達することはありません。
_size
は反復毎に増加するため、ループに到達することはありません。
関連
-
[解決済み] リストから要素を削除しようとすると、UnsupportedOperationExceptionが発生するのはなぜですか?
-
[解決済み] IEnumerableにForEach拡張メソッドがないのはなぜですか?
-
[解決済み] 割り当て後にリストが予期せず変更されました。その理由と防止策を教えてください。
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] なぜ[]はlist()よりも速いのですか?
-
[解決済み] なぜC#は汎用属性型を禁止しているのですか?
-
[解決済み] なぜC#は静的メソッドにインターフェイスを実装できないのか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み】foreachなしでリストからリストへアイテムをコピーするにはどうすればいいですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。