Member 12789975 Ответов: 3

Создание экземпляра словаря из другого


У меня есть следующий VB-код. Я создал словарь под названием ArabicCodesLettersShapesDic as public. Я попытался сохранить элемент этого словаря в другом локальном словаре под названием ArabicCodesLettersShapesDicTemp, и когда я обновляю локальный словарь, добавляя или удаляя элементы, эти обновления появляются в исходном, и я не хочу, чтобы исходный (общедоступный) обновлялся. Поэтому я хочу обновить локальный, не обновляя исходный. Как я могу сделать этот механизм.

Function FindingMissingArabicLetter(ByVal AllArabicCodes As String) As String
     Dim MissingArabicLetters As String = ""
     Dim MyArray() As String = AllArabicCodes.Split(New String() {Environment.NewLine}, StringSplitOptions.None)
     Dim ArabicCodesLettersShapesDicTemp As New Dictionary(Of String, String)
     ArabicCodesLettersShapesDicTemp = ArabicCodesLettersShapesDic
     System.Array.Sort(Of String)(MyArray)
     For Each arrItem As String In MyArray

         If ArabicCodesLettersShapesDicTemp.ContainsKey(arrItem) = True Then
             ArabicCodesLettersShapesDicTemp.Remove(arrItem)
         End If
     Next
     For Each dicItem As String In ArabicCodesLettersShapesDicTemp.Keys
         MissingArabicLetters = MissingArabicLetters & (ArabicCodesLettersShapesDicTemp.Item(dicItem)) & vbNewLine

     Next

     'For Each item As KeyValuePair(Of String, String) In ArabicCodesLettersShapesDic
     '    MessageBox.Show(item.Key + "   " + item.Value)
     'Next

     Return MissingArabicLetters



 End Function


Что я уже пробовал:

Я попытался поискать об этом, но не смог найти Сола.

3 Ответов

Рейтинг:
5

phil.o

Существует конструктор копирования для Dictionary тип:

Dim ArabicCodesLettersShapesDicTemp As New Dictionary(Of String, String)(ArabicCodesLettersShapesDic)

Источник:
Словарь< TKey, TValue> конструктор (IDictionary< TKey, TValue>)[^]


Member 12789975

Я попробовал то, что вы написали, но получил следующую ошибку на ArabicCodesLettersShapesDicTemp

Разрешение перегрузки не удалось, потому что ни один доступный "новый" не может быть вызван без сужающего преобразования:
...

phil.o

Не могли бы вы поделиться декларацией ArabicCodesLettersShapesDic переменная?

Member 12789975

Я объявил свой ArabicCodesLettersShapesDic как private shared readonly, и теперь он работает нормально. Большое спасибо за всех вас и особенно за вас.
это было: Dim ArabicCodesLettersShapesDic As New Dictionary (of String, String) From ..
new: Shared ReadOnly ArabicCodesLettersShapesDic As New Dictionary (of String, String) From ...

phil.o

Пожалуйста.

Рейтинг:
2

Richard MacCutchan

Ваш временный словарь - это просто ссылка на оригинал, поэтому у вас есть только один настоящий словарь. Ваш временный должен быть создан путем копирования или клонирования оригинала. Видеть Object.MemberwiseClone Метод (Система)[^].


Member 12789975

Спасибо, решение, которое вы сказали, а также примеры, все они применимы к ООП, и я пишу свой код без этой парадигмы (то есть ООП). Не могли бы вы предложить мне решение с помощью процедурного кода, который я здесь показываю?

Рейтинг:
1

User 11061201

Проблема заключается вот в чем;

ArabicCodesLettersShapesDicTemp = ArabicCodesLettersShapesDic


Чтобы добиться того, чего вы хотите, нужно вручную заполнить элементы во временном словаре из исходного, используя Add() процедура или другое


Member 12789975

Да, я могу написать функцию, содержащую метод add, но я сохраню это решение до конца!