2016-05-28 6 views
1

Der Einfachheit halber; Stellen Sie sich eine Schleife von Klassenwagen vor; wo jedes Auto eine Liste von Autosystemen enthält; Die zweite Schleife durchläuft jedes System, um sie aus diesem Auto zu entfernen. Idealerweise wird am Ende jedes Auto keine Systeme haben.Foreach-Schleife wird nicht vorgerückt und keine Ausnahme ausgelöst

Dies ist der vereinfachte Code.

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); 
    } 
} 

wenn das System zu entfernen, alles, was ich tue, ist die Remove-Methode der Liste zu nennen, in der Autos-Klasse enthält.

Die erste Entfernung ist erfolgreich; Wenn es dann Zeit ist, das nächste Element zu entfernen, anstatt den Rückruf erneut auszuführen, geht es auf die vorherige foreach zurück und lädt das nächste Auto in die Liste.

Blick auf den Namen des nächsten Systems; Ich sehe immer noch die vorherige, als ob die Schleife nicht das nächste Element in der Liste nehmen würde. Ich sehe keine Ausnahme, es ist das erste Mal, dass ich dieses Verhalten sehe, und kann nicht wirklich herausfinden, was passiert, da ich keine Rückmeldung aus dem Debugger bekomme.

+0

Offensichtlich ist dies nicht der exakte Pseudocode Ihres Algorithmus. Als @ Saeid Yazdani schlägt vor, dass Sie wahrscheinlich Ihre Sammlung ändern (obwohl Sie einen Fehler bekommen sollten) oder etwas anderes falsch machen. Wenn Sie für wechseln, erhalten Sie kein "CollecionModifiedException", aber der Code funktioniert nicht, ohne den Index zu ändern.Ich schlage vor, dass Sie die List.RemoveAll-Methode verwenden, um eine Liste zu leeren oder eine temporäre Liste mit den zu entfernenden Elementen zu erstellen und RemoveRange für das Original zu verwenden –

+1

Es ist vereinfacht; Ansonsten sollte ich mindestens 3 weitere Klassen und Methoden hinzufügen. Saeid sah das Problem genau. –

+1

Hey @newbiez was los. Vergessen Sie nicht bei der Programmierung als allgemeiner Prinzipal, Sie müssen oft eine Liste BACKWARDS *** durchlaufen, wenn Sie löschen. Saeid hat dir die Antwort hier gegeben. Aber vergessen Sie nicht, dass "Trick", es ist eine grundlegende Software. – Fattie

Antwort

3

Sie sollten eine for Schleife verwenden. In foreach können Sie die Sammlung nicht unter der Schleife ändern.

AFAIK, foreach verwendet einen Enumerator und eine Iterationsvariable in foreach wird nur gelesen. Der Enumerator gibt eine COPY des Objekts zurück ... deshalb erhalten Sie keine Ausnahme. Sie haben tatsächlich die Kopie des Objekts anstelle des Objekts selbst bearbeitet.

+0

Deshalb konnte ich den Fehler nicht sehen, DANKE !!!! Warum gibt VS keine Ausnahme aus, wenn versucht wird, ein nicht modifizierbares Objekt zu modifizieren? –

+2

AFAIK, Foreach verwendet einen Enumerator und eine Iterationsvariable in foreach wird nur gelesen. Der Enumerator gibt eine COPY des Objekts zurück ... deshalb erhalten Sie keine Ausnahme. Sie haben tatsächlich die Kopie des Objekts anstelle des Objekts selbst bearbeitet. –

+0

Macht Sinn; logisch, die Operation ist legal, also ist der Compiler glücklich. Vielen Dank. –

Verwandte Themen