2009-06-30 24 views
7

que estoy tratando de recuperar el valor correcto de un ArrayList de objetos (.NET 1.1 Framework):recuperación de datos de un ArrayList de objetos VB.NET

Tengo el siguiente definidos:

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 

El código de evento Form_Load contiene:

Dim AnItemObj As New ItemInfo 

a continuación, un lazo que incluye:

AnItemObj.ItemNo = AFile.RecordId 
AnItemObj.ItemType = temp 
AlList.Add(AnItemObj) 

Así que ahora debería tener un ArrayList de estos objetos, sin embargo si intento para recuperar los datos:

MsgBox(AlList(5).ItemNo) 

siempre consigo el itemNo del último valor de la lista.

¿Qué me estoy perdiendo?

+1

Para un novato, esta pregunta está muy bien formateada y presentada. +1 – Cerebrus

Respuesta

5

ponga el siguiente código:

Dim AnItemObj As New ItemInfo 

dentro el bucle que se suma a la lista AnItemObj.

Cuando agrega un tipo de referencia a una lista, solo está agregando la referencia, no el valor.

Esto significa que si agrega 10 veces la misma instancia a una lista, agregará 10 veces la misma referencia a la lista. Pero si luego aún tiene una referencia a esta instancia, puede modificar sus propiedades y, como las 10 entradas de la lista apuntan a la misma referencia en la memoria, se modificarán las 10 entradas.

+0

¡Suéltame! +1 – Cerebrus

1

Por lo tanto, usted tiene:

Dim AnItemObj As New ItemInfo 
For ... 
    AnItemObj.ItemNo = AFile.RecordId 
    AnItemObj.ItemType = temp 
    AlList.Add(AnItemObj) 
Next 

Lo que ocurre aquí es que está creando un único objeto, el establecimiento de los valores en él, y la adición de una referencia a él, a su lista. Estás a continuación, cambiar su ItemInfo y addign otra referencia al mismo artículo a su lista de

Es necesario construir un nuevo objeto en cada bucle, sin apretar así:

Dim AnItemObj As ItemInfo 
For ... 
    AnItemObj = New ItemInfo 
    AnItemObj.ItemNo = AFile.RecordId 
    AnItemObj.ItemType = temp 
    AlList.Add(AnItemObj) 
Next 
0

¿Va a crear una nueva instancia de iteminfo para cada incremento del ciclo

0

No puedo ver el código de bucle completo, pero me imagino que la causa no es establecer AnItemObj en un nuevo objeto ItemInfo. Entonces terminas modificando el mismo objeto y agregándolo nuevamente a la lista (todos los elementos en la lista apuntan al mismo objeto).

AnItemObj = New ItemInfo() 
AnItemObj.ItemNo = AFile.RecordId 
AnItemObj.ItemType = temp 
AlList.Add(AnItemObj) 
Cuestiones relacionadas