2015-12-03 23 views
7

Nota: Questo funziona già bene, ma sto cercando di capire perché funziona in questo modo, ma non l'altro.Confusione di codice: perché uno funziona, ma non l'altro?

Ho una WinForm (C#) con messo dinamicamente le immagini, in questo modo: enter image description here

Ora, se si fa clic sul pulsante 'Napred', queste immagini dovrebbero essere cancellati (tra le altre cose), per il quale ho inizialmente utilizzato:

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

o

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

Ora, se corro questo, ottengo:

enter image description here

Ma se mi limito a cambiare la dichiarazione for per inviarlo a ritroso, è funziona?

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

(io non ho intenzione di caricare un'altra immagine, ma elimina tutti gli elementi (ho solo i pulsanti sinistro alla fine))

Qualcuno può illuminarmi perché si lavora , ma non l'altro?

EDIT: sto usando community edition VS2015 su Windows 10 se si tratta di un errore di debug

+0

Se si dispone di un array di 10 elementi e quindi eliminare Item1, Item2 diventerà nuovo Item1 e avrai 9 articoli rimanenti. Il metodo standard di smaltimento degli elementi dell'array consiste nel passarlo indietro. – LightBulb

+0

Potrebbe essere di interesse per altri approcci: http://stackoverflow.com/questions/7340757/c-sharp-list-removing-items-while-looping-iterating –

+0

Perché non usi il metodo Remove? –

risposta

12

Stai cercando di cambiare la lista che stai iterazione di, che ovviamente cambierà il (?) indici di questa lista quindi quello che era all'indice 1 è ora all'indice 0.

Rimuovendo dalla fine dell'array (vale a dire al contrario), gli indici precedenti saranno sempre gli stessi.

La sua anche importante notare come indicato nel commento di Matthew Watson:

Control.Dispose() è speciale e sarà rimuovere il controllo dalla lista Controlli di un contenitore padre.

Questo non è il default behavour dalla maggior parte dei metodi Dispose in modo quindi non troverete sempre questo comportamento quando si utilizza Dispose

+1

Capisco, ecco perché ogni 2 ° elemento viene eliminato. Grazie per il chiarimento! Non mi è passato per la testa! – NemanjaT

+2

Penso che dovresti essere chiaro su come sta cambiando la lista su cui sta iterando, perché solo ispezionando il codice non sta rimuovendo direttamente gli oggetti dalla lista. La risposta è che 'Control.Dispose()' è speciale e rimuoverà il controllo dall'elenco 'Controls' di un contenitore genitore. –

+0

@MatthewWatson - Verissimo, stavo cercando di mantenere questo generico in riferimento agli elenchi stessi – Sayse