Sto iterando su una collezione e voglio cancellarne alcune voci. Esempio:
For i = 0 To Node.Nodes.Count
If i >= args.TotalNumberOfNodes Then
Node.Nodes.RemoveAt(i)
End If
Next i
Come puoi vedere, se una condizione è vera, voglio eliminare l'elemento dalla raccolta. Se passo un elenco di 20 elementi in questo, ciò che accade è che l'elemento ogni 2 viene eliminato per un motivo ovvio: se l'elemento deve essere rimosso, viene rimosso, il che diminuisce la dimensione dell'elenco di 1 e poi i
viene incrementato di uno che lascia fuori l'elemento corrente.
Un altro approccio (di lavoro) è:
For i = 0 To Node.Nodes.Count
If i >= args.TotalNumberOfNodes Then
Node.Nodes.RemoveAt(i)
i = i - 1
End If
Next i
Questa tecnica decrementa i
di 1 prima che venga incrementata alla fine del ciclo for generando lo stesso i
di prima. Poiché questo mi sembra un po 'come un cattivo design e non è completamente comprensibile per i lettori, vorrei sapere se esiste un modo migliore per rimuovere elementi da un elenco ma non saltare l'elemento successivo da questo elenco.
In aggiunta a questo, con un ciclo per ogni loop mi getta un'eccezione perché tenta di scorrere l'elenco che è attualmente in corso di modifica. In un altro post, ho visto l'approccio di aggiungere tutto a un nuovo elenco e quindi utilizzare un metodo removeAll
. Ciò funzionerebbe tecnicamente ma per motivi di prestazioni vorrei manipolare la lista mentre ci passo sopra.