Iterate su Collection rimuovendo elementi da esso

1

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.

    
posta Freddy 20.05.2016 - 01:25
fonte

2 risposte

4

Dal momento che gli elenchi crescono e si restringono dalla loro fine, puoi facilmente risolvere il problema semplicemente scorrendo sulla lista nell'ordine inverso.

For i = Node.Nodes.Count-1 To 0 Step -1
    If SomeCondition Then
        Node.Nodes.RemoveAt(i)
    End If
Next i
    
risposta data 20.05.2016 - 02:18
fonte
1

È possibile utilizzare un ciclo Do per eseguire la stessa attività:

    Do
        myCollection.RemoveAt(MaxCount)
    Loop Until myCollection.Count = MaxCount

Questo rimuoverà i singoli elementi della raccolta al valore massimo di conteggio.

C'è anche una variazione di Do ... Loop While del ciclo.

Puoi trovare ulteriori informazioni su strutture del ciclo di VB qui.

    
risposta data 20.05.2016 - 05:12
fonte

Leggi altre domande sui tag