vb.net arraylist of 객체에서 데이터를 검색합니다
문제
객체의 배열 목록 (.NET 1.1 프레임 워크)에서 올바른 값을 검색하려고합니다.
다음은 정의되어 있습니다.
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
form_load 이벤트 코드에는 다음이 포함됩니다.
Dim AnItemObj As New ItemInfo
그런 다음 다음을 포함하는 루프입니다.
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
이제이 객체의 배열 목록이 있어야하지만 데이터를 검색하려고하면 다음과 같습니다.
MsgBox(AlList(5).ItemNo)
나는 항상 목록에서 마지막 값의 항목을 얻습니다.
내가 무엇을 놓치고 있습니까?
해결책
다음 코드를 넣으십시오.
Dim AnItemObj As New ItemInfo
내부에 ANITEMOBJ를 목록에 추가하는 루프.
목록에 참조 유형을 추가하면 값이 아닌 참조 만 추가합니다.
즉, 동일한 인스턴스의 10 배를 목록에 추가하면 목록에 대해 동일한 참조의 10 배를 추가합니다. 그러나 나중에이 인스턴스에 대한 참조가 있으면 속성을 수정할 수 있으며 목록의 10 개 항목이 모두 메모리의 동일한 참조를 가리므로 10 개의 항목이 모두 수정됩니다.
다른 팁
그래서 당신은 다음과 같습니다.
Dim AnItemObj As New ItemInfo
For ...
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
여기서 일어나는 일은 단일 객체를 만들고 값을 설정하고 목록에 참조를 추가하는 것입니다. 그런 다음 iteminfo를 변경하고 같은 항목에 대한 다른 참조를 목록에 추가합니다.
각 루프에 새 개체를 건설해야합니다.
Dim AnItemObj As ItemInfo
For ...
AnItemObj = New ItemInfo
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)
Next
루프의 각 증분에 대해 iteminfo의 새 인스턴스를 생성하고 있습니까?
전체 루프 코드를 볼 수 없지만 원인이 AnitemoBJ를 새로운 iteminfo 객체로 설정하지 않는다고 생각합니다. 따라서 동일한 객체를 수정하고 목록을 다시 추가하게됩니다 (목록의 모든 항목은 동일한 개체를 가리 킵니다).
AnItemObj = New ItemInfo()
AnItemObj.ItemNo = AFile.RecordId
AnItemObj.ItemType = temp
AlList.Add(AnItemObj)