2016-05-28 13 views
1

簡潔にするため、クラスの車のループを想像してください。各車には車のシステムのリストが含まれています。第2のループは各システムを通過して、それらの車からそれらを除去する。理想的には、最終的には、各車にはシステムがありません。Foreachループが進まず、例外もスローされない

これは簡略化されたコードです。

public class ParseCars: MonoBehaviour 
{ 
    foreach (cars a_car in cars_list) 
    { 
     // retrieve the systems for the current car 
     List<car_system> systems_list = a_car.ReturnSystemList(); 

     foreach (car_system a_system in systems_list) 
     { 
      a_car.RemoveSystem(a_system); 
     } 
     Debug.Log("removed all systems for this car); 
    } 
} 

システムを削除するときは、カークラスに含まれるリストのRemoveメソッドを呼び出すだけです。

最初の削除に成功しました。次の要素を削除する時に、remove呼び出しを再度実行するのではなく、前のforeachに戻り、リスト内の次のカーをロードします。次のシステムの名前を見ると

。私はループがリストの次の項目を取らないように、以前のものをまだ見ています。 私は例外を見ません、私はこの動作を見て初めて、デバッガからのフィードバックを得ないので、実際に何が起こっているのか理解できません。

+0

は明らかにこれはあなたが得ることはありませんのために切り替えwrong.If正確な(あなたがエラーを取得する必要がありますが)あなたはおそらくあなたのコレクションを変更示唆してあなたのalgorithm.As @Saeid Yazdaniの擬似コードまたはやって何か他のものではありません「CollecionModifiedException」が、コードがindex.Iを・修正せずに動作しませんが、あなたがList.RemoveAllメソッドリストを空にするか、削除する要素を一時リストを作成し、それが簡略化され、元の –

+1

上の利用RemoveRangeを使用することをお勧め。それ以外の場合は少なくとも3つのクラスとメソッドを追加する必要があります。 Saeidはこの問題を見るのにスポットを当てていました。 –

+1

こんにちは@newbiez何をアップ。一般的なプリンシパルとしてプログラミングすることを忘れないでください。あなたは、削除するときに、しばしば*** BACKWARDS ***を実行しなければなりません。 Saeidは答えをあなたに与えました。しかし、 "トリック"を忘れないでください。ソフトウェアの基本です。 – Fattie

答えて

3

あなたはforループを使用する必要があります。 foreachでは、ループの下でコレクションを変更することはできません。

私の知る限り、foreachはforeachの中に列挙および反復変数が読み取り専用である使用します。列挙子は、オブジェクトのCOPYを返します...なぜあなたは例外を取得しません。オブジェクト自体ではなく、オブジェクトのコピーを実際に編集しました。

+0

それは、THANKSだ!!!!変更不可能なオブジェクトを変更するときにVSが例外をスローしないのはなぜですか? –

+2

AFAIK、foreachはforeachの列挙子と反復変数を使用します。列挙子は、オブジェクトのCOPYを返します...なぜあなたは例外を取得しません。オブジェクト自体ではなく、オブジェクトのコピーを実際に編集しました。 –

+0

意味があります。論理的には、操作は合法であるため、コンパイラは満足しています。ありがとう。 –

関連する問題