Framework結論から言うと、foreachの中でリストの要素を削除するのは無理です。Removeはやめましょう削除しようとすると以下のように例外が起きます。コレクションが変更されました。列挙操作は実行されない可能性があります。}}代替手段foreachで削除するのは諦めて代わりの方法を探します。以降で使用するクラスを先に記載します。for文を逆順で回す言語を問わず最も一般的な方法です。Remove(list[i])は使わない事。RemoveAllメソッドで削除List.RemoveAllにラムダ式で削除条件を指定して削除します。ほんの少しだけforの逆順より早く動作します。Whereで抜粋するListに定義された拡張メソッドのWhereを使用し、「元のリストはそのまま」で新しく条件に一致するリスト(本当はシーケンスですが...)を取得します。コレクションが変更されました。列挙操作は実行されない可能性があります。}Listに対して条件付きのイテレーターを作成するだけで、評価自体は遅延実行(=呼び出した時にコストが発生)なのでこの操作自体はほぼノーコストで完了します。繰り返しになりますが、この場合元のListの内容は変化しません。自作する全然おすすめでもなんでもないですが拡張メソッドを用いて自作してみます。RemoceAllなどのシーケンスにContinueやbreakが使えないという文句を言う方がいるので併せて対応します。削除する}使い方は以下の通り。基本処理を続ける});作っておいてなんですが、(1)のforの逆順の方がいいですね。動作も3倍くらい遅いです。RemoveはやめましょうQiitaにToArrayすれば削除できると書かれていましたが、この記事のように書いてはいけません。別に動くんですが、メモリが最悪倍必要になったり、Remove()はリスト内を検索してO(N)の計算量なので、削除量が多いととんでもなく遅くなります。(全件削除で数百倍遅い。因みに、List.ToArray()の実装はは以下の通り。抜粋していますが、新しい配列を宣言して中身を全部コピーしています。値型のオブジェクトだと丸ごとコピーでメモリ倍です。array;}Qiitaさん...*1:通常の方法だとね。»Profile受託ソフト会社員でWin系業務屋。趣味でCocos2d-x/C++を触っています。etc...主に受託・開発ネタ、Windowsの事、Srellaris、ゲーム制作の進捗の事を喋ります。Core3.xとUnityでAES暗号化を利用するC#の標準機能でデータを圧縮・展開するC#で属性を利用して処理に制約の説明を追加するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。