Что самый быстрый путь состоит в том, чтобы скопировать значения и ключи из одного словаря в другого в C#?

Для тех, кто все еще сталкивается с этой проблемой (я пробовал все вышеперечисленные предложения) -

Если вы используете 64-разрядную версию Windows, и вы установили 32-разрядную JDK, помимо корректировки переменных PATH, вам также может потребоваться настроить переменные реестра.

Я вытаскивал свои волосы, правильно установив свои переменные PATH - все равно бесполезно - и то только нахождение «освобожденных» Java-записей в моем реестре, по-видимому, является устаревшей для исправления «пропущенной» среды выполнения Java.

Используя Process Monitor, чтобы посмотреть программу, которую я пытался начать, чтобы вынюхивать, где она просматривается в реестре для Java (среда выполнения), я с триумфом обнаружил, что она смотрит в 32-разрядная версия записей реестра, найденная в HKEY_LOCAL_MACHINE\SOFTWARE\**Wow6432Node**\JavaSoft\Java Runtime Environment.

Внутри этого ключа вы должны найти подразделы разных версий Java, установленных (прошлых и / или настоящих). Нажмите на подраздел последней версии (например, мой подраздел - 1.7.0_25). После нажатия на этот подраздел вы увидите значения строки реестра, указанные справа, и особенно JavaHome и RuntimeLib. Вам нужно изменить значения этих двух значений, чтобы соответственно отразить как текущую папку, так и файл jvm.dll.

Например, в моем случае значения были (ранее) соответственно установлены на C:\Program Files (x86)\Java\jre7 и C:\Program Files (x86)\Java\jre7\bin\client\jvm.dll, которые отсутствуют на моей машине. Мне пришлось обновить их до текущей папки и файла C:\Program Files (x86)\Java\jdk1.7.0_25\jre и C:\Program Files (x86)\Java\jdk1.7.0_25\jre\bin\client\jvm.dll.

Опять же, это будет полностью зависеть от того, какая версия Java (JDK и / или JRE) вы установили - - 32 или 64-бит - и какой тип операционной системы вы используете - 32 или 64-разрядные. Просто имейте в виду, что они отражены в разных местах реестра (например, Wow6432Node для 32-разрядных приложений, в моем случае с 32-разрядным JDK, установленным на 64-разрядной машине).

что я обновил эти два значения реестра, моя программа работает безупречно, без каких-либо икота или жалоб о недостающей среде выполнения Java Runtime Environment (из реестра).

27
задан Helephant 18 September 2008 в 08:24
поделиться

5 ответов

Нет ничего неправильно с для/цикл foreach. Это - весь, гипотетический метод AddRange сделал бы так или иначе.

единственное дополнительное беспокойство, которое я имел бы, с поведением выделения памяти, потому что добавление большого количества записей могло вызвать несколько перераспределений и рехеширований. Нет никакого способа увеличить способность существующего Словаря данной суммой. Вы могли бы быть более обеспеченным выделением нового Словаря с достаточной способностью к обоим текущим, но Вам все еще будет нужен цикл для загрузки по крайней мере одного из них.

17
ответ дан Mike Dimmick 14 October 2019 в 13:55
поделиться

Существует Dictionary конструктор, который берет другой Dictionary.

необходимо будет бросить его IDictionary, но существует Add() перегрузка, которая берет KeyValuePair<TKey, TValue>. Вы все еще используете foreach, все же.

21
ответ дан bluish 14 October 2019 в 13:55
поделиться

Если Вы имеете дело с двумя существующими объектами, Вы могли бы получить некоторый пробег с методом CopyTo: http://msdn.microsoft.com/en-us/library/cc645053.aspx

Использование Добавить метод другого набора (получатель) для поглощения их.

0
ответ дан Oli 14 October 2019 в 13:55
поделиться

Я не понимаю, почему не использование Словаря (Словарь) (как предложено ageektrapped).

Вы хотите выполнить Мелкую Копию или Глубокую Копию? (то есть, оба Словаря, указывающие на те же ссылки или новые копии каждого объекта в новом словаре?)

, Если Вы хотите создать новый Словарь, указывающий новый объекты, я думаю, что единственный путь через foreach.

0
ответ дан jfs 14 October 2019 в 13:55
поделиться

Для забавы я создал этот дополнительный метод к словарю. Это должно сделать глубокую копию по мере возможности.

public static Dictionary<TKey, TValue> DeepCopy<TKey,TValue>(this Dictionary&lt;TKey, TValue> dictionary)
        {
            Dictionary<TKey, TValue> d2 = new Dictionary<TKey, TValue>();

            bool keyIsCloneable = default(TKey) is ICloneable;
            bool valueIsCloneable = default(TValue) is ICloneable;

            foreach (KeyValuePair<TKey, TValue> kvp in dictionary)
            {
                TKey key = default(TKey);
                TValue value = default(TValue);
                if (keyIsCloneable)
                {
                    key = (TKey)((ICloneable)(kvp.Key)).Clone();
                }

                else
                {
                    key = kvp.Key;
                }

                if (valueIsCloneable)
                {
                    value = (TValue)((ICloneable)(kvp.Value)).Clone();
                }

                else
                {
                    value = kvp.Value;
                }

                d2.Add(key, value);
            }

            return d2;
        }
3
ответ дан BFree 14 October 2019 в 13:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: