vba: словарь, переданный функции, действующей как "ByRef", когда принудительно "ByVal" - PullRequest
2 голосов
/ 25 октября 2011

У меня есть словарь dictA, который содержит {AA,1},{AB,2},{AC,3}, и корректирующий словарь dictAdj, содержащий {AB,-4}.

Я передаю эти два в функцию, вызывающую ее funcReconcile(ByVal Arg1 as Dictionary, ByVal Arg2 as Dictionary) as Dictionary.

Функция будет перебирать содержимое dictAdj, чтобы увидеть, существуют ли они в dictA.

Затем функция настроит dictA (например), чтобы в выходном словаре отображалось {AA,1},{AB,-2},{AC,3}.

По какой-то причине, когда функция возвращает словарь, мой первоначальный dictA также вступает в силу, заставляя его отображать {AA,1},{AB,-2},{AC,3}, а не {AA,1},{AB,4},{AC,3}, как следует.

Я знаю, что есть проблемыв VBA с передачей ByRef и ByVal для объектов, но это первый случай, когда я действительно ударился головой о стену чем-то вроде этого.

Есть какие-нибудь указатели?(без каламбура)

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Вам потребуется создать метод копирования, создать полную копию словаря, а затем внести изменения в копию.

Присвоение новой переменной просто присваивает исходную ссылку новой переменной -который указывает на исходные данные.

Вот фрагментарный код из Копировать из одного объекта словаря в другой? :

a=dictionary1.items
b=dictionary1.keys
for i=0 to ubound(a)
  dictionary2.add(b(i), a(i))
next
0 голосов
/ 14 сентября 2013

Этот пост действительно старый, он может не помочь оригинальному постеру.Я сталкивался с этим, исследуя то же самое.Мое решение (я считаю) лучше.Он использует linq вместо цикла, который экономит ресурсы.Мой код в vb, так как это то, что использует мой проект, но вы можете использовать конвертер кода для изменения функции.

Простое решение в 1 строку.2 отдельных словаря, которые являются точными копиями (отдельные личности):

Dim dictionary2 As Dictionary(Of Integer, String) = dictionary1.ToDictionary(Function(k) k.Key, Function(k) k.Value.ToString())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...