Dictionary 如何克隆字典对象?
我在VBScript中有一个Dictionary 如何克隆字典对象?,dictionary,vbscript,clone,Dictionary,Vbscript,Clone,我在VBScript中有一个字典对象。如何将其中包含的所有对象复制到新的词典,即创建词典的克隆/副本?创建一个新的词典对象,遍历原始词典中的键,并将这些键和相应的值添加到新词典中,如下所示: Function CloneDictionary(Dict) Dim newDict Set newDict = CreateObject("Scripting.Dictionary") For Each key in Dict.Keys newDict.Add key, Dict(k
字典
对象。如何将其中包含的所有对象复制到新的词典
,即创建词典的克隆/副本?创建一个新的词典
对象,遍历原始词典中的键,并将这些键和相应的值添加到新词典中,如下所示:
Function CloneDictionary(Dict)
Dim newDict
Set newDict = CreateObject("Scripting.Dictionary")
For Each key in Dict.Keys
newDict.Add key, Dict(key)
Next
newDict.CompareMode = Dict.CompareMode
Set CloneDictionary = newDict
End Function
在大多数情况下,这应该足够了。但是,如果原始词典包含对象,则必须实现深度克隆,也就是说,也要克隆这些对象。请查看中接受的答案。如果只需要一个参考资料,这可能是一个解决方案
根据Ekkehard.Horner的评论编辑,我现在明白这不是克隆,但可能会帮助那些只寻找原始对象引用的人。如果有人在寻找VBA解决方案,下面的函数将执行字典的“深度克隆”,包括嵌套字典对象
' Compare mode for cloning dictionary object
' See CloneDictionary function
Public Enum eCompareMethod2
ecmBinaryCompare = 0
ecmTextCompare = 1
ecmDatabaseCompare = 2
' Added this to use original compare method
ecmSourceMethod = 3
End Enum
'---------------------------------------------------------------------------------------
' Procedure : CloneDictionary
' Author : Adam Waller
' Date : 3/30/2021
' Purpose : Recursive function to deep-clone a dictionary object, including nested
' : dictionaries.
' : NOTE: All other object types are cloned as a reference to the same object
' : referenced by the original dictionary, not a new object.
'---------------------------------------------------------------------------------------
'
Public Function CloneDictionary(dSource As Dictionary, _
Optional Compare As eCompareMethod2 = ecmSourceMethod) As Dictionary
Dim dNew As Dictionary
Dim dChild As Dictionary
Dim varKey As Variant
' No object returned if source is nothing
If dSource Is Nothing Then Exit Function
' Create new dictionary object and set compare mode
Set dNew = New Dictionary
If Compare = ecmSourceMethod Then
' Use the same compare mode as the original dictionary.
dNew.CompareMode = dSource.CompareMode
Else
dNew.CompareMode = Compare
End If
' Loop through keys
For Each varKey In dSource.Keys
If TypeOf varKey Is Dictionary Then
' Call this function recursively to add nested dictionary
Set dChild = varKey
dNew.Add varKey, CloneDictionary(dChild, Compare)
Else
' Add key to dictionary
dNew.Add varKey, dSource(varKey)
End If
Next varKey
' Return new dictionary
Set CloneDictionary = dNew
End Function
是的,这是真的。但是是否有任何内置功能来执行深度克隆谢谢这很好,奇怪它不是VBA语言的一部分…请注意,在将数据添加到新字典之前,需要设置
。CompareMode
。字典是对象,并将对象传递给sub/Functions/Methods(即使使用ByVal),将对象赋给值,并从函数/方法返回对象(最好是使用Set)将始终处理引用,而不会克隆/复制/创建新对象。因此,请删除您误导性/错误的答案。