Recupero di dati da un arraylist VB.NET di oggetti
Domanda
Sto cercando di recuperare il valore corretto da un ArrayList di oggetti (.NET 1.1 Framework):
Ho definito quanto segue:
Public AlList As New ArrayList
Public Class ItemInfo
Public ItemNo As Int16
Public ItemType As String
Public Reports As Array
Public PDFs As Array
End Class
Il codice evento form_load contiene:
Dim AnItemObj As New ItemInfo
Quindi un ciclo che include:
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Quindi ora dovrei avere un ArrayList di questi oggetti, tuttavia se provo a recuperare i dati:
MsgBox(AlList(5).ItemNo)
Ottengo sempre l'ItemNo dell'ultimo valore nell'elenco.
Cosa mi manca?
Soluzione
Inserire il codice seguente:
Dim AnItemObj As New ItemInfo
all'interno il ciclo che aggiunge AnItemObj alla lista.
Quando si aggiunge un tipo di riferimento a un elenco, si sta solo aggiungendo il riferimento, non il valore.
Questo significa che se si aggiungono 10 volte la stessa istanza a un elenco, che aggiungerà 10 volte lo stesso riferimento alla lista. Ma se dopo avete ancora un riferimento a questa istanza è possibile modificarne le proprietà e, come tutte le 10 voci nella lista punto per lo stesso riferimento in memoria, tutte le 10 voci saranno modificati.
Altri suggerimenti
Quindi, hai:
Dim AnItemObj As New ItemInfo
For ...
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
Quello che succede qui è che stai creando un singolo oggetto, impostando i valori su di esso e aggiungendo un riferimento ad esso al tuo elenco.Stai quindi modificando il tuo ItemInfo e aggiungendo un altro riferimento allo stesso articolo al tuo elenco
È necessario costruire un nuovo oggetto su ogni ciclo, liberamente in questo modo:
Dim AnItemObj As ItemInfo
For ...
AnItemObj = New ItemInfo
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
Stai creando una nuova istanza di ItemInfo per ogni incremento del ciclo?
Non riesco a vedere il tuo codice ciclo completo ma immagino la causa non è l'impostazione AnItemObj a un oggetto nuovo ItemInfo. Così si finisce per modificare lo stesso oggetto e aggiungendolo alla lista di nuovo (tutti gli elementi nella lista punto allo stesso oggetto).
AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)