Приветствую! Столкнулся со странным поведением массива словарей. Добавление очередного элемента вызывает замещение предыдущих на него же. Как обойти — показал, но, мне кажется, что заполнение словаря, как элемента массива будет дольше, ведь нужно постоянно обращаться к массиву.
Код
Код
Private Sub Fill(dic As Dictionary, sPref$)
dic.RemoveAll
dic.Add sPref & "_1", 1
dic.Add sPref & "_2", 2
dic.Add sPref & "_3", 3
End Sub
'==================================================================================================
Private Sub Test_Bad()
Dim dic As New Dictionary
Dim aDic() As Dictionary ' As New Dictionary Also Bad
ReDim aDic(3)
Fill dic, "a": Set aDic(1) = dic
Debug.Print "a", Join(aDic(1).Keys) ' a_1 a_2 a_3
Fill dic, "b": Set aDic(2) = dic
Debug.Print "a", Join(aDic(1).Keys) ' b_1 b_2 b_3
Debug.Print "b", Join(aDic(2).Keys) ' b_1 b_2 b_3
Fill dic, "c": Set aDic(3) = dic
Debug.Print "a", Join(aDic(1).Keys) ' c_1 c_2 c_3
Debug.Print "b", Join(aDic(2).Keys) ' c_1 c_2 c_3
Debug.Print "c", Join(aDic(3).Keys) ' c_1 c_2 c_3
End Sub
'==================================================================================================
Private Sub Test_Good()
Dim aDic() As New Dictionary
ReDim aDic(3)
Fill aDic(1), "a"
Debug.Print "a", Join(aDic(1).Keys) ' a_1 a_2 a_3
Fill aDic(2), "b"
Debug.Print "a", Join(aDic(1).Keys) ' a_1 a_2 a_3
Debug.Print "b", Join(aDic(2).Keys) ' b_1 b_2 b_3
Fill aDic(3), "c"
Debug.Print "a", Join(aDic(1).Keys) ' a_1 a_2 a_3
Debug.Print "b", Join(aDic(2).Keys) ' b_1 b_2 b_3
Debug.Print "c", Join(aDic(3).Keys) ' c_1 c_2 c_3
End Sub
Почему так и как ещё можно побороть? Судя по тестам, при Set aDic(1) = dic создаётся СВЯЗЬ между элементом массива и этим временным словарём, и, заполняя временный словарь, я сразу заполняю и элемент массива …
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
благодарю! Сейчас протетстирую скорость 2ух подходов
UPD. По скорости — паритет. Тогда я выбираю вариант №2 (без посредников) ☺
Код
Option Base 1
Option Explicit
Option Private Module
'==================================================================================================
Const nDic& = 500, nEl& = 50000
'==================================================================================================
Private Sub FillTmp(dic As Dictionary)
Dim n&
Set dic = New Dictionary
For n = 1 To nEl
dic.Add n, 0
Next n
End Sub
'--------------------------------------------------------------------------------------------------
Private Sub Test_Bad()
Dim dic As Dictionary
Dim aDic() As Dictionary
Dim t!, n&
t = Timer
ReDim aDic(nDic)
For n = 1 To nDic
FillTmp dic
Set aDic(n) = dic
Next n
Debug.Print Round(Timer - t, 2) ' ~ 9.5 sec
End Sub
'==================================================================================================
'==================================================================================================
Private Sub FillArr(dic As Dictionary)
Dim n&
For n = 1 To nEl
dic.Add n, 0
Next n
End Sub
'--------------------------------------------------------------------------------------------------
Private Sub Test_Good()
Dim aDic() As New Dictionary
Dim t!, n&
t = Timer
ReDim aDic(nDic)
For n = 1 To nDic
FillArr aDic(n)
Next n
Debug.Print Round(Timer - t, 2) ' ~ 9.5 sec
End Sub
'==================================================================================================
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄