2015-12-03 6 views
7

Hinweis: Das funktioniert schon gut, aber ich versuche zu verstehen, warum es so funktioniert, aber nicht der andere.Code Verwirrung - warum funktioniert man, aber nicht die andere?

ich dynamisch eine WinForm (C#) haben mit Bildern setzen, etwa so: enter image description here

Nun, wenn Sie die ‚Napred‘ Schaltfläche klicken, sollten diese Bilder gelöscht werden (unter anderem), für die ich ursprünglich verwendet: Jetzt

foreach(Control ctrl in Controls) 
    if(ctrl is PictureBox) ctrl.Dispose(); 

oder

for(int i = 0; i < Controls.Count; i++) 
    if(Controls[i] is PictureBox) Controls[i].Dispose(); 

, wenn ich dies ausführen, erhalte ich:

enter image description here

Aber wenn ich nur das es for Aussage ändern zurück zu schicken, es arbeitet?

for(int i = Controls.Count - 1; i >= 0; i--) 
    if(Controls[i] is PictureBox) Controls[i].Dispose(); 

(Ich werde ein anderes Bild nicht hochgeladen werden, aber es löscht alle Elemente (Ich werde nur die Tasten am Ende links))

Kann mich jemand aufklären, warum ein arbeitet aber nicht die anderen?

EDIT: Ich verwende VS2015 Community Edition unter Windows 10, wenn ein Debugging-Fehler ist

+0

Wenn Sie ein Array von 10 Stück und dann element1 löschen, wird Element2 neue element1 werden und du wirst 9 Gegenstände übrig haben. Die Standardmethode zur Entsorgung von Array-Elementen besteht darin, sie rückwärts zu durchlaufen. – LightBulb

+0

Könnte für andere Ansätze von Interesse sein: http://stackoverflow.com/questions/7340757/c-sharp-list-removing-items-while-looping-iterating –

+0

Warum verwenden Sie nicht Remove-Methode? –

Antwort

12

Sie versuchen, um die Liste ändern Sie iterieren, was natürlich die Änderung (?) Indexe dieser Liste, also was war bei Index 1 ist jetzt bei Index 0.

Durch Entfernen vom Ende des Arrays (dh in Ihrem Reverse) werden die vorherigen Indizes immer gleich sein.

Es ist auch wichtig zu beachten, wie in Matthew Watson Kommentar angegeben:

Control.Dispose() ist etwas Besonderes und wird die Steuerung von einem übergeordneten Container der Liste Steuerelemente entfernen.

Dies wird standardmäßig nicht behavour von den meisten Entsorgen Methoden so deshalb werden Sie nicht immer dieses Verhalten finden, wenn Dispose mit

+1

Ich verstehe, deshalb wird jedes zweite Element gelöscht. Danke für das Aufräumen! Es kam mir überhaupt nicht in den Sinn! – NemanjaT

+2

Ich denke, Sie sollten sich darüber im Klaren sein, wie er die Liste, über die er iteriert, ändert, weil er gerade beim Überprüfen des Codes die Elemente nicht direkt aus der Liste entfernt. Die Antwort ist, dass 'Control.Dispose()' eine Besonderheit ist und das Steuerelement aus der 'Controls'-Liste eines übergeordneten Containers entfernt. –

+0

@MatthewWatson - Sehr wahr, ich habe versucht, diese generische in Bezug auf Listen selbst zu halten – Sayse