Public Module Module1
Public objDictionary As New Dictionary(Of String, ArrayList)
End Module
Dim i As Integer
Dim j As Integer
Dim temp As New ArrayList
For j = 0 To (objCreater.RowCount - 2)
i = 1
temp.Clear()
For i = 1 To 4 'Marker 1 for comments
If i = 4 Then
temp.Insert(i - 1, New ArrayList())
Else
temp.Insert(i - 1, Convert.ToInt32(objCreater.Rows(j).Cells(i).Value))
End If
Next
objDictionary.Add(objCreater.Rows(j).Cells(0).Value, temp) 'Marker 2 for comments
Next
当每次迭代执行Above代码时,与temp变量关联的每个键都会发生变化。
因此,如果您的输入如下所示:http://imgur.com/yWDo1
立即模式 ?对于j = 0循环的第一次传递,objDictionary(“red”)将给出预期的。
?objDictionary("red")
Count = 4
(0): 1 {Integer}
(1): 2 {Integer}
(2): 3 {Integer}
(3): Count = 0
然而,在第二遍中,?objDictionary(“red”)的值随着临时ArrayList的变化而变化。
?objDictionary(“red”)在标记1
?objDictionary("red")
Count = 0
?objDictionary(“red”)在标记2
?objDictionary("red")
Count = 4
(0): 3 {Integer}
(1): 2 {Integer}
(2): 1 {Integer}
(3): Count = 0
换句话说,所使用的最后一行的值存储在每个键值字典组合中。你如何防止这种情况发生?它显然与temp变量的使用有关,因为字典随着temp变量的变化而变化。有没有办法只复制数组中的值,而不是将字典与数组的更改值相关联?
答案 0 :(得分:1)
如您所料,您指向所有插入的同一个数组。
这意味着每当您进行更改时,每个条目都会受到影响。
解决方案是每次迭代都将temp
指向新的ArrayList
- 即。将来电替换为temp.clear()
:
temp = new ArrayList