Pergunta

Eu estou tentando recuperar o valor correto de um ArrayList de objetos (.NET Framework 1.1):

Eu tenho a seguinte definida:

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

O código de evento Form_Load contém:

Dim AnItemObj As New ItemInfo

Em seguida, um loop que inclui:

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

Então, eu deveria agora tenho um ArrayList desses objetos, no entanto, se eu tentar recuperar os dados:

MsgBox(AlList(5).ItemNo)

Eu sempre obter o ItemNo do último valor na lista.

O que eu estou ausente?

Foi útil?

Solução

Coloque o seguinte código:

Dim AnItemObj As New ItemInfo

dentro o loop que adiciona AnItemObj à lista.

Quando você adiciona um tipo de referência a uma lista, você está apenas adicionando a referência, não o valor.

Isto significa que se você adicionar 10 vezes a mesma instância a uma lista, ele irá adicionar 10 vezes a mesma referência à lista. Mas, se depois você ainda tem uma referência a este exemplo, você pode modificar suas propriedades e, como todas as 10 entradas na lista aponte para a mesma referência na memória, todas as 10 entradas será modificado.

Outras dicas

Então, você tem:

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

O que está acontecendo aqui é que você está criando um único objeto, definindo os valores nele, e adicionar uma referência a ele, à sua lista. Você está em seguida, alterando o seu ItemInfo e addign outra referência para o mesmo item à sua lista

Você precisa construir um novo objeto em cada loop, vagamente assim:

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

Você está criando uma nova instância do iteminfo para cada incremento do loop?

Eu não posso ver o seu código de loop completo, mas eu imagino que a causa não é a criação AnItemObj a um objeto New ItemInfo. Então você só acabam modificando o mesmo objeto e adicioná-lo à lista novamente (todos os itens na lista aponte para o mesmo objeto).

AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top