Elimina element in list

di il
7 risposte

Elimina element in list

Ho una list con un numero variabili di elementi anche con numeri ripetuti più volte uguali.

Chiamo la funzione
 For Col = 1 To 3

            Call eliminazione(ListaInviata)

        Next Col
Genero 6 numero casuali e questi numeri devo trovarli nella lista ( ListaCompleta) , li memorizzo in un array ed eliminarli dalla lista anche se ci sono più volte. Questo lo faccio con :
ListaRicevuta.RemoveAll(Function(r) r.ToString = 44)
Finito questo tutto ok. Funziona,

Il problema è che al secondo giro devo partire dalla stessa lista e generare altri numeri ed eseguire di nuovo le eliminazioni.

Il problema è che nelfrattempo la listaInviata non ha più i numeri iniziali che sono stati tolti dal giro precedente.
A me però servono.

Anche se memorizzo la lista vecchia iniziale in una nuova lista prima di cancellare, per esempio ListaNuova = ListaInviata mi trovo sempre che
anche la seconda lista ha i valori mancanti come la prima anche al secondo giro

come potrei fare?

7 Risposte

  • Re: Elimina element in list

    È meglio se posti tutto il codice ,se si tratta di un esercizio posta la traccia,ciao
  • Re: Elimina element in list

    visualrenzo ha scritto:


    Anche se memorizzo la lista vecchia iniziale in una nuova lista prima di cancellare, per esempio ListaNuova = ListaInviata mi trovo sempre che
    anche la seconda lista ha i valori mancanti come la prima anche al secondo giro
    Direi che devi approfondire la differenza tra Reference Type e Value Type.

    La lista dei tuoi numeri è un oggetto che contiene un insieme di interi: se fai quel tipo di assegnazione, stai solo facendo puntare un'altra variabile alla medesima lista, copiandone il riferimento, quindi qualsiasi modifica tu faccia attraverso una qualsiasi di quelle variabili, stai in realtà agendo sempre sulla medesima lista.

    Devi fare un "clone" della lista, ossia generare una nuova lista di numeri da assegnare a una variabile partendo dalla lista di partenza e ottenendo così due diversi riferimenti.

    Questo tipo di operazioni le potresti ottenere facilmente usando i metodi di LINQ.

    Ecco un esempio di codice per rendere l'idea:
    [CODE] ' Creo una lista dei numeri che vanno da 0 a 100 Dim StartList = Enumerable.Range(0, 100).ToList() ' Applico un filtro e ottengo una lista dei numeri maggiori di 44 Dim ChildList = StartList.Where(Function (Num) Num > 44).ToList() ' Applico un filtro e creo una lista dei numeri pari Dim EvenList = StartList.Where(Function(Num) Num Mod 2 = 0).ToList() Il metodo Where() di LINQ ti consente di specificare una condizione per filtrare gli elementi, ma hai a disposizione anche OrderBy(), oppure Skip() o Take(), First() o Last() ecc. per partire dalla tua lista, o da qualsiasi valore "enumerabile", e applicare un filtro, un ordinamento, una proiezione di un dato di diverso tipo, una funzione di aggregazione, ecc.

    Nell'esempio sopra ho usato Where() per riprodurre l'effetto simile al filtro che hai applicato tu, mentre ToList() permette di estrarre i valori che soddisfano il criterio estraendoli sottoforma di lista, e ovviamente si tratta di una lista diversa da quella di partenza, che rimane disponibile per ulteriori operazioni.

    In breve, più che agire sulla lista di partenza in modo diretto o clonarla per modificarla tenendo l'originale, ti consiglio invece di generare le liste dei valori che ti servono applicando LINQ per definire i criteri degli elementi che devono essere (o non essere) presenti, come li vuoi ordinati, quanti ne vuoi, ecc.

    Il codice ne guadagnerà in leggibilità e semplicità e l'approccio sarà più simile a una programmazione funzionale, con tutti i vantaggi che ne derivano.

    Ciao!
  • Re: Elimina element in list

    Devo controllare ancora il metodo che ha postato Alka, cmq posto lo stesso il codice estrapolato dal contesto
    Public Class Form1
        Dim ListaCompleta As New List(Of Integer)
        Dim Sestina(6) As Integer
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
    
            Call caricalista()
    
    	' funziona solo al primo giro
            For Col = 1 To 1 ' dovrebbe essere un numero variabile es. 10 volte  
                'Call caricalista()
                Call eliminazione(ListaCompleta, Col)
    
            Next Col
    
        End Sub
        Private Sub eliminazione(listaPassata As List(Of Integer), C As Integer)
    
            Dim numeroestratto As Integer = 0
            '    ' Initialize the random-number generator.
            Randomize()
    
    
            Dim NumeriTolti As String
    
            If (listaPassata.Count) > 0 Then
    
                'For C = 1 To 3
                '        ' devo ricomporre la lista originale
    
    
                '        ' estraggo i 6 numeri per la colonna
                NumeriTolti = ""
                For N = 0 To 5
    
                    ' ad ogni giro cambia la listmax perchè nel frattempo elimino elementi
                    Dim ListaMax As Integer = listaPassata.Count - 1
    
                    'Genero un numero da 1 fino alla lunghezza della lista
    
                    Dim value As Integer = CInt(Int((ListaMax * Rnd()) + 1))
                    numeroestratto = 0
    
                    numeroestratto = Val(listaPassata(value).ToString)
                    NumeriTolti = NumeriTolti & " " & numeroestratto
                    ' lo metto nell' array nella posizione x della colonna y
                    Sestina(N) = numeroestratto
    
                    ' la lista si riduce
                    listaPassata.RemoveAll(Function(r) r.ToString = numeroestratto)
    
    
                Next N
    
    
    
                ListBox1.Items.Add("")
                ListBox1.Items.Add("TOLTI")
                ListBox1.Items.Add(NumeriTolti)
                ListBox1.Items.Add("")
                ListBox1.Items.Add("RIMASTI")
                For i = 0 To listaPassata.Count - 1
                    ListBox1.Items.Add(listaPassata(i))
                Next i
    
                ListBox1.Items.Add("")
                ListBox1.Items.Add("Estrazione")
    
                For i = 0 To 5
                    ListBox1.Items.Add(Sestina(i))
                Next i
    
            Else
                MsgBox("attenzione listaCompleta passata vuota " & listaPassata.Count)
            End If
    
    
    
        End Sub
    
        Private Sub caricalista()
            ListaCompleta.Add(2)
            ListaCompleta.Add(22)
            ListaCompleta.Add(32)
            ListaCompleta.Add(22)
            ListaCompleta.Add(12)
            ListaCompleta.Add(23)
            ListaCompleta.Add(23)
            ListaCompleta.Add(23)
            ListaCompleta.Add(25)
            ListaCompleta.Add(62)
            ListaCompleta.Add(66)
            ListaCompleta.Add(44)
            ListaCompleta.Add(33)
            ListaCompleta.Add(22)
    
            ListBox1.Items.Add("ListaCompleta")
            For i = 0 To ListaCompleta.Count - 1
                ListBox1.Items.Add(i + 1 & "°   " & ListaCompleta(i))
            Next i
    
        End Sub
    End Class
    Naturalmentese faccio di nuovo la chiamata caricalista() dentro al ciclo, funziona, ma siccome i numeri vengono prelevati da un sito, non mi sembra il caso.

    For Col = 1 To 1 ' dovrebbe essere un numero variabile es. 10 volte

    Si accettano consigli e critiche
    Ciao
  • Re: Elimina element in list

    Alka, quelloche dici l' avevo fatto ma non ha funzionato,
    Devi fare un "clone" della lista, ossia generare una nuova lista di numeri da assegnare a una variabile partendo dalla lista di partenza e ottenendo così due diversi riferimenti.

    Magari ho sbagliato qualcosa, sicuramente ho fatto una banale uguaglianza senza cambiare il tipo.
    Hai un esempio per capire?, cmq ho postato il nio codice di esempio
  • Re: Elimina element in list

    visualrenzo ha scritto:


    Alka, quello che dici l' avevo fatto ma non ha funzionato
    Sicuramente ci sarà un errore, ma senza vedere come hai utilizzato i metodi di LINQ è impossibile dire qualcosa.

    visualrenzo ha scritto:


    Magari ho sbagliato qualcosa, sicuramente ho fatto una banale uguaglianza senza cambiare il tipo.
    Chi può dirlo?

    visualrenzo ha scritto:


    Hai un esempio per capire?
    Te l'ho già riportato nella mia risposta, con dovizia di indicazioni generali.
    Non saprei cosa altro scriverti.

    visualrenzo ha scritto:


    cmq ho postato il nio codice di esempio
    Sì, ma è un po' un guazzabuglio difficile da leggere, e in ogni caso utilizza un approccio "imperativo", ossia chiama il metodo RemoveAll() che agisce sulla lista rimuovendo gli elementi.

    Nel mio esempio, non viene chiamato un metodo che agisce sulla lista originale modificandone il contenuto, quindi togliendo gli elementi non richiesti, bensì viene usato il metodo Where() di LINQ in modo similare al tuo RemoveAll(), ma la condizione dovrebbe indicare quali sono gli elementi da tenere (e non quelli da rimuovere) usando poi ToList() per produrre il risultato, ovvero una nuova lista generata a partire da quella iniziale (che rimane invariata) e contenente gli elementi che hanno superato il filtro.

    Riprendendo il tuo esempio, non bisogna fare [CODE]listaPassata.RemoveAll(Function(r) r.ToString = numeroestratto) bensì [CODE]Dim nuovaLista = listaPassata.Where(Function(r) r.ToString <> numeroestratto).ToList() In quel caso, listaPassata non viene modificata e rimane con i suoi elementi originali, mentre in nuovaLista avrai una copia della lista originale con gli elementi indesiderati che sono stati rimossi.

    Meglio di così non saprei spiegartelo o illustrartelo: devi prenderti il tempo di leggere, approfondire, capire, provare e poi intervenire sul tuo codice.

    Ciao!
  • Re: Elimina element in list

    Provo e vediamo. grazie
  • Re: Elimina element in list

    Ok, capito tutto, adesso è chiaro dove sbagliavo, e con le dovute accortezze funziona.

    Ciao
Devi accedere o registrarti per scrivere nel forum
7 risposte