PhysifApps

趣味と開発メモ保管庫

foreach内でListのRemoveしようとするとエラー

foreachのループの中でListの要素をRemoveしようとしたらこんなエラーが。

InvalidOperationException: Collection was modified; enumeration operation may not execute.

該当の処理はこんな感じ。

foreach ( HogeData item in m_DataList ) {
    if ( item.id == id ) {
        m_DataList.Remove( item );
    }
}

原因

そもそもこの挙動は仕様らしい。

foreachの処理中にコレクションに追加・削除が発生すると InvalidOperationException を出すみたい。

解決方法

解決方法は色々あるとは思うので要件に合わせて対処する。

forだと出ないのでforにしてもいいかもだし、

for ( int i = 0; i < m_DataList.Count; i++ ) {
    if ( m_DataList[ i ].id == id ) {
        m_DataList.Remove( m_DataList[ i ] );
    }
}

リストを複製してforeach回す用途で使うとか。

複製したリストでforeachを回して、Removeをするのは複製元のリストから、といった感じ。

// リストを複製
List< HogeData > tempList = new List< HogeData >( m_DataList );

// 複製したリストで回してチェックまでやったら元の方のリストからデータを削除
foreach ( HogeData item in tempList ) {
    if ( item.id == id ) {
        m_DataList.Remove( item );
    }
}

今までそういう操作しなかったからか、知らなかったのでいい勉強になった。