我想在字典中使用数组作为一组值
为什么会这样,我不能像改变它们那样改变那些数组中的值,如果它们是"简单"数组?
让我们看一些例子:
如果我创建一个数组,并更改第n个元素的值,则会发生确定。
Sub arrTest()
Dim a As Variant
a = Array(1, 2, 3)
Debug.Print a(0), a(1), a(2)
a(1) = 8
Debug.Print a(0), a(1), a(2)
End Sub
'Output:
' 1 2 3
' 1 8 3
如果我尝试对词典中的数组执行相同的操作,它们根本不会更改,但也不会给出错误消息。参见:
Sub tess()
Dim Dic As Object, Coll As Collection
Set Dic = CreateObject("scripting.dictionary")
Dic.Add "A", Array(1, 2)
Dic.Add "B", 5
Debug.Print Dic.keys()(0), Dic(Dic.keys()(0))(0), Dic(Dic.keys()(0))(1)
Debug.Print Dic.keys()(1), Dic(Dic.keys()(1))
Dic("A")(1) = 8
Dic("B") = 8
Debug.Print Dic.keys()(0), Dic(Dic.keys()(0))(0), Dic(Dic.keys()(0))(1)
Debug.Print Dic.keys()(1), Dic(Dic.keys()(1))
End Sub
'Output:
'A 1 2
'B 5
'
'A 1 2
'B 8
在上面的示例中,我的非数组值正确地更改为8,而数组中的值仍为2
为什么这样,错误在哪里......等等?
的修改
正如@FloLie建议的那样,不幸的是,在与Dictionary中的Arrays进行交互时,会创建一个不可见的副本,这会造成混乱。
但是,对于我的代码中的简单操作,我无法实现多线混乱,所以这是我的最终解决方案:
Private Sub mReplaceDicArray(Dic As Object, kEy As Variant, Element As Integer, NewValue)
Dim tempArray As Variant
tempArray = Dic(kEy)
tempArray(Element) = NewValue
Dic(kEy) = tempArray
End Sub
' call as:
' Call mReplaceDicArray(Dic, "A", 1, 8)
答案 0 :(得分:2)
问题在于,当您使用Dic("A")
将数组从字典中取出时,您将获得副本而不是引用。见:already bound
解决方案是将副本临时存储在变量中,在dict中操作并替换它:
mArray = Dic("A")
mArray(1) = 8
Dic("A") = mArray