Saya mencoba membuat kamus kamus di vba (Excel). Ketika saya menetapkan kamus anak saya ke orang tua, sepertinya itu menambahkan pointer alih-alih menyalin kamus.

Sub DictionaryTest()
    Dim dicParent As Object
    Set dicParent = CreateObject("Scripting.Dictionary")
    
    Dim dicChild As Object
    Set dicChild = CreateObject("Scripting.Dictionary")
    
    For i = 0 To 1 ' Create 2 entries in parent
        dicChild.RemoveAll ' Clear the child dictionary
        
        dicChild.Add "Child Key 1", "Child Item = " & i
        
        dicParent.Add "Parent Key " & i, dicChild
        
        Debug.Print _
           "Inside Loop:", _
           dicParent.Keys()(i), _
           dicParent.Items()(i).Keys()(0), _
           dicParent.Items()(i).Items()(0)
    Next i
    
    For i = 0 To dicParent.Count - 1
        Debug.Print _
           "Outside Loop:", _
           dicParent.Keys()(i), _
           dicParent.Items()(i).Keys()(0), _
           dicParent.Items()(i).Items()(0)
    Next i
End Sub

Saya berakhir dengan kamus dengan semua item diatur ke loop terakhir:

Inside Loop:  Parent Key 0  Child Key 1   Child Item = 0
Inside Loop:  Parent Key 1  Child Key 1   Child Item = 1

Outside Loop: Parent Key 0  Child Key 1   Child Item = 1
Outside Loop: Parent Key 1  Child Key 1   Child Item = 1

Bagaimana cara yang tepat untuk mencegahnya?

0
Dave Thunes 6 Mei 2021, 18:22

1 menjawab

Jawaban Terbaik

Jika ini adalah pengikatan awal, kamus anak akan ditetapkan sebagai kamus baru di dalam loop menggunakan Set dicChild = New Dictionary. Dalam penjilidan akhir, anak ditetapkan sebagai kamus baru menggunakan Set dicChild = CreateObject("Scripting.Dictionary").

Dengan kata lain, pindahkan definisi kamus anak di dalam loop:

Sub DictionaryTest()
    Dim dicParent As Object
    Set dicParent = CreateObject("Scripting.Dictionary")
    
    Dim dicChild As Object
    
    For i = 0 To 1 ' Create 10 entries in parent
        Set dicChild = CreateObject("Scripting.Dictionary")
        
        dicChild.Add "Child Key 1", "Child Item = " & i
        
        dicParent.Add "Parent Key " & i, dicChild
        
        Debug.Print _
           "Inside Loop:", _
           dicParent.Keys()(i), _
           dicParent.Items()(i).Keys()(0), _
           dicParent.Items()(i).Items()(0)
    Next i
    
    For i = 0 To dicParent.Count - 1
        Debug.Print _
           "Outside Loop:", _
           dicParent.Keys()(i), _
           dicParent.Items()(i).Keys()(0), _
           dicParent.Items()(i).Items()(0) dicParent.Items()(i).Items()(0)
    Next i
End Sub

Hasilnya sekarang benar:

Inside Loop:  Parent Key 0  Child Key 1   Child Item = 0
Inside Loop:  Parent Key 1  Child Key 1   Child Item = 1

Outside Loop: Parent Key 0  Child Key 1   Child Item = 0
Outside Loop: Parent Key 1  Child Key 1   Child Item = 1
1
Dave Thunes 6 Mei 2021, 15:22