+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 5 su 5

Discussione: manipolazione elementi list

  1. #1
    SebastianoFloridia non è in linea Scolaretto
    Post
    124

    manipolazione elementi list

    Ciao a tutti.
    mi sto incartando in una gestione banale di liste.
    Ho una list dichiarata:

    codice:
    List<short> diametri = new List<short> { 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 };
    da questa lista devo eliminare delle ali esterne secondo l'impostazione dell'utente mediante combobox.


    codice:
    List<short> diametridisponibiliij = diametri;
           
              
                foreach (var item in diametri)
                {
                    if (item > Convert.ToDouble(CmbDiamMaxIJ.Text) || item < Convert.ToDouble(CmbDiamMinIJ.Text))
                    {
                        diametridisponibiliij.Remove(item);
                    }
                }

    I valori intercettati non vengono rimossi.
    come se la lista creata sia connessa alla lista da cui l'ho copiata.
    Il count è uguale in ambedue anche con il remove.
    Quale può essere il problema.

    Saluti
    Sebastiano Floridia

  2. #2
    SebastianoFloridia non è in linea Scolaretto
    Post
    124
    Aggiungo che ad un certo punto del ciclo, va in errore!!!
    Saluti
    Sebastiano Floridia

  3. #3
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    257
    Quote Originariamente inviato da SebastianoFloridia Visualizza il messaggio
    ...I valori intercettati non vengono rimossi...
    È strano. Quando verifichi se sono stati rimossi oppure no?
    Quote Originariamente inviato da SebastianoFloridia Visualizza il messaggio
    ...come se la lista creata sia connessa alla lista da cui l'ho copiata...
    Le due listo SONO connesse. Il passaggio tra variabili oggetto, in C# come in VB.NET, viene fatto per riferimento e non per valore. Tu hai creato un riferimento alla lista originale, non l'hai copiata. In breve, se elimini un elemento dalla lista, riesci a vederlo da entrambe le variabili.

    Per aggirare il problema puoi pensare di dichiarare la lista temporanea così:
    codice:
    List<short> diametridisponibiliij = new List<short>(diametri);
    Così facendo crei una nuova lista partendo da quella originale

    Quote Originariamente inviato da SebastianoFloridia Visualizza il messaggio
    Aggiungo che ad un certo punto del ciclo, va in errore!!!
    Quale tipo di errore?

  4. #4
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Luogo
    Reggio Emilia
    Post
    1,143
    Quote Originariamente inviato da SebastianoFloridia Visualizza il messaggio
    I valori intercettati non vengono rimossi.
    Non è chiaro perché tu abbia creato una lista di short per poi confrontare i valori trasformando il testo in numero con Convert.ToDouble.
    Fai in modo che i tipi siano uguali: o short o double.
    Inoltre, la tua condizione if per me è sbagliata, perché il valore dovrebbe essere maggiore del minimo e minore del massimo, usando un operatore && (AND) e non un || (OR).

    Quote Originariamente inviato da SebastianoFloridia Visualizza il messaggio
    come se la lista creata sia connessa alla lista da cui l'ho copiata.
    Non solo la lista è connessa, ma si tratta proprio della stessa!
    Se assegni una variabile che fa riferimento a una lista ad un'altra variabile, stai solo copiando il valore del riferimento alla medesima lista, ma non crei un clone.

    Quote Originariamente inviato da SebastianoFloridia Visualizza il messaggio
    Aggiungo che ad un certo punto del ciclo, va in errore!!!
    E' giusto che vada in errore: stai facendo un ciclo foreach sugli elementi di una lista durante il quale ne vai a rimuovere ipoteticamente alcuni!

    Il metodo più semplice è usare LINQ:

    codice:
    var allDiametri = new List<short> { 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 };
    
    var maxDiametro = Convert.ToInt16(CmbDiamMaxIJ.Text);
    var minDiametro = Convert.ToInt16(CmbDiamMinIJ.Text);
    
    var diametriDisponibili = (
    	from d in allDiametri
    	where d >= minDiametro && d <= maxDiametro
    	select d
    ).ToList();
    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Homepage | Blog | Delphi Podcast | Delphi Succinctly (e-book)

  5. #5
    SebastianoFloridia non è in linea Scolaretto
    Post
    124
    Grazie!!
    Ho preferito usare la versione linq, ma mi è stato chiarito anche la gestione degli oggetti per valore o riferimento.
    Degli aiuti non si butta niente!!! ;-)


    Saluti e Grazie
    Sebastiano Floridia

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi