Newsgroup: it.comp.lang.visual-basic
Titolo: [VB.NET] modificare oggetto di una list (of T)

Ciao a tutti,
in un mio progetto in 
VB.NET
 ho fatto una classe squadra che contiene al 
suo interno una list (of persona)
Persona è una semplice struttura con
- cognome
- nome
- punti
Adesso vorrei aggiungere alla classe squadra il metodo update_punti per 
aggiornare il punteggio di una persona noto il suo cognome, una cosa tipo
s.update("Paolino", 8)
dove "Paolino" è il cognome della persona che voglio aggiornare e 8 è il 
nuovo punteggio. Ovviamente per semplicità il cognome è chiave primaria 
nella tabella delle persone.
Io ho scritto questo codice, ma il valore del punteggio rimane 
invariato. Cosa sbaglio?
Public Class squadra
     Private componenti As New List(Of persona)
     Public Sub New()
         Dim p As persona
         p.nome = "Paperino"
         p.cognome = "Paolino"
         p.punti = 12
         componenti.Add(p)
         p.nome = "Gastone"
         p.cognome = "Paperone"
         p.punti = 5
         componenti.Add(p)
     End Sub
     Public Function get_punteggio(ByVal cognome As String) As Integer
         For Each i In componenti
             If i.cognome = cognome Then
                 Return i.punti
             End If
         Next
         Return 0
     End Function
     Public Sub cambia_punteggio(ByVal cognome As String, ByVal 
punteggio As Integer)
         For Each i In componenti
             If i.cognome = cognome Then
                 i.punti = punteggio
             End If
         Next
     End Sub
End Class
Structure persona
     Dim nome As String
     Dim cognome As String
     Dim punti As Integer
End Structure
Seconda domanda:
è il modo giusto di fare le cose quello che ho adottato oppure si può 
accedere agli elementi della lista anche senza doverla scorrere tutta un 
elemento alla volta? In particolare non mi piacciono molto di due cicli 
foreach che devo fare per leggere e/o settare un valore.
Mi piacerebbe poter fare una cosa del tipo
     Public Function get_punteggio(ByVal cognome As String) As Integer
         Return componenti.item("cognome").punti
     End Function
Si può fare?
ciao e grazie
Mauro


Perche' invece di List(of T) non usi un Dictionary( Of TKey, TValue)?
Nel tuo caso sarebbe:
Private componenti as new Dictonary(of String, Persona)
Attenzione che se usi il cognome come chiave, dai per scontato che sarà 
univoco... sicuro?
E la funzione di estrazione, con i dovuti controlli da aggiungere diventa:
Public Function get_punteggio(ByVal cognome As String) As Integer
	Return componenti(cognome).punti
End Function
Magari ci sono altri modi di gestire il tutto, comunque il dictionary
mi sembra già un miglioramento.
Roberto

 foreach che devo fare per leggere e/o settare un valore.
Ti basta usare, al posto di List(of) una qualche altra lista che trovi nella namespace System.Collection che supporti anche l'accesso per chiave, ad es. Dictionary(of) o KeyedCollection ecc...

 non si riflette sulla variabile in 'componenti' ma resta valida solo per 'i'
GRAZIE !!!!
Ecco l'inghippo, avevo pensato che fosse una cosa del genere, ma non 
c'ero proprio arrivato alla soluzione.
Se al posto di una structure avessi usato un oggetto avrebbe funzionato? 
Adesso ci provo :-)
ciao
Mauro

 univoco... sicuro?
Si, il caso reale è più complesso e non uso il cognome, qui ho 
sintetizzato per brevità e facilità di esposizione.
ciao
Mauro

 Adesso ci provo :-)
Si, con una Class avrebbe funzionato esattamente come l'avevi scritto... non che sia per forza sbagliata la scelta della Structure, dipende poi da cosa ne devi fare, però devi ricordarti di questi dettagli.