La rimozione di elementi da una List(Of t) in vb.net in mancanza di

Ho un elenco generico che sto rimozione di oggetti fuori uso List.Remove(Object). Sono stato la rimozione di elementi, ma quando mi arriva il quinto elemento sto rimozione non riesce e non rimuoverlo dall’elenco. Non sembra importa cosa sto rimuovendo ma ogni volta che provo a rimuovere le cinque voci di esito negativo il quinto elemento.

Che cosa potrebbe essere la causa? Guardando la documentazione per List(Of T).Remove, non specifica che cosa algoritmo che utilizza per rimuovere l’elemento.

I dettagli dell’errore, si prega di…
E il codice sarebbe bello 🙂
Puoi presentare a noi un po ‘ di codice ? il tipo di oggetto in elenco, la dimensione, ecc
Quali tipi specifici sono aggiunta alla Lista? Sono builtin .NETTO tipi, o sono gli Oggetti di un tipo personalizzato creato?
Sono oggetti personalizzati ho creato. Sto eliminazione dall’elenco passando l’oggetto che si desidera rimuovere dal .metodo di rimozione. Io non sto facendo questo in un ciclo.

OriginaleL’autore Cody C | 2009-12-17

5 Replies
  1. 12

    Remove sta per corrispondenza, in base chiamata .Equals sui tuoi oggetti. Per impostazione predefinita per un dato oggetto, ti abbinano solo le stesso oggetto. Se si desidera che due oggetti con la stessa proprietà di essere considerati uguali, anche se non sono lo stesso oggetto, è necessario sostituire il Equals metodo e mettere la vostra logica.

    Tuttavia, un’altra buona opzione è quella di utilizzare RemoveAll e passare un delegato anonimo o un’espressione lambda con i criteri che stai cercando. E. g.:

    customers.RemoveAll(customer => customer.LastName.Equals(myCustomer.LastName));

    Naturalmente che funziona solo se si vuole veramente per rimuovere tutti elementi corrispondenti, e/o se si abbia la certezza ci sarà solo quella che corrisponde.

    OriginaleL’autore Ryan Lundy

  2. 2

    Se si utilizza un indicizzati in base al metodo per rimuovere elementi dalla lista e ricordare che gli indici degli elementi dopo quello che si rimuovere cambierà da -1 come rimuovere quelli prima.

    +1 – per quello che avevo scommessa è la risposta corretta, nonostante la scarsa dettagli nella domanda.
    Che è il motivo per cui, se si sta usando un indice basato su metodo, dovrebbe essere l’enumerazione dalla fine dell’elenco all’inizio.
    O in ogni passo si può incrementa la variabile di ciclo o rimuovere un elemento, ma non entrambi.

    OriginaleL’autore Jeffrey Hines

  3. 0

    Quanti elementi sono nella tua lista? Come te la rimozione di loro, solo un ciclo? Tenete a mente che queste sono basato su 0 liste. Se si sta facendo ogni sorta di ciclo con un numero intero non può funzionare come la rimozione di elementi.

    OriginaleL’autore Shawn Steward

  4. 0

    Come regola generale, si dovrebbe modificare una collezione che looping, solo gli elementi all’interno della raccolta. Il problema con la rimozione di elementi all’interno di un ciclo for each è che cambia la raccolta in loop e interferisce con la lista di conte e di iterazione posizione.

    Soluzioni comuni sono:

    1. Loop attraverso la raccolta all’indietro in modo che le interferenze con l’iteratore non influenza l’esecuzione
    2. Creare una nuova collezione in modo da poter modificare una collezione e loop su un altro.

    Loop All’Indietro:

    Ecco un metodo di estensione che prende in Collection(Of T) (si potrebbe utilizzare un List(Of T), ma la classe list già espone un RemoveAll metodo che sostanzialmente fa la stessa cosa).

    Ritorneremo indietro e verificare la validità di ogni elemento della collezione basata sul passato in funzione lambda. Se corrisponde, quindi provvederemo a rimuovere.

    <Extension()>
    Public Sub RemoveEach(Of T)(ByRef col As Collection(Of T),
                                ByVal match As Func(Of T, Boolean))
        For i = col.Count - 1 To 0 Step -1
            If match(col(i)) Then col.RemoveAt(i)
        Next
    End Sub

    Quindi utilizzare come questa:

    Dim col = New Collection(Of Integer)({1, 2, 3, 4}.ToList)
    col.RemoveEach(Function(i) (i Mod 2) = 0)
    'Produces list of 1 & 3

    Creare Nuova Collezione:

    È più efficiente per tenere traccia della raccolta di indice e di rimuovere gli elementi utilizzando RemoveAt invece di Remove che prende un oggetto e poi controlla anche il resto della collezione per le partite contro l’oggetto. Tuttavia, se si voleva davvero un modo per il processo di rimozione di elementi all’interno di un Ciclo For, che si potrebbe chiamare ToList sulla collezione originale, creando così un nuovo elenco. Quindi, è possibile eseguire un ciclo nuovo elenco per trovare gli elementi che devono essere rimossi dall’originale. Ogni volta che si trova un oggetto, è possibile rimuovere in modo sicuro da collezione originale, perché non è attualmente enumerato.

    <Extension()>
    Public Sub RemoveEachObject(Of T)(ByRef col As Collection(Of T), 
                                      ByVal match As Func(Of T, Boolean))
        For Each o As T In col.ToList()
            If match(o) Then col.Remove(o)
        Next
    End Sub

    Per ulteriori informazioni, check out questo grande risposta per Rimuovere da un Elenco all’interno di un ‘foreach’ loop.

    OriginaleL’autore KyleMit

  5. -1

    Se si utilizza per il ciclo di rimuovere gli elementi, si dovrebbe considerare l’utilizzo di foreach, è più adatto per gli insiemi, liste e numerabile oggetti

    Se si rimuove un elemento dalla lista nel mezzo di un ciclo foreach che sarà lui a ottenere un InvalidOperationException come la collezione è stata modificata.

    OriginaleL’autore jose

Lascia un commento