Для тех, кто все еще сталкивается с этой проблемой (я пробовал все вышеперечисленные предложения) -
Если вы используете 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 (из реестра).
Нет ничего неправильно с для/цикл foreach. Это - весь, гипотетический метод AddRange сделал бы так или иначе.
единственное дополнительное беспокойство, которое я имел бы, с поведением выделения памяти, потому что добавление большого количества записей могло вызвать несколько перераспределений и рехеширований. Нет никакого способа увеличить способность существующего Словаря данной суммой. Вы могли бы быть более обеспеченным выделением нового Словаря с достаточной способностью к обоим текущим, но Вам все еще будет нужен цикл для загрузки по крайней мере одного из них.
Существует Dictionary
конструктор, который берет другой Dictionary
.
необходимо будет бросить его IDictionary
, но существует Add()
перегрузка, которая берет KeyValuePair<TKey, TValue>
. Вы все еще используете foreach, все же.
Если Вы имеете дело с двумя существующими объектами, Вы могли бы получить некоторый пробег с методом CopyTo: http://msdn.microsoft.com/en-us/library/cc645053.aspx
Использование Добавить метод другого набора (получатель) для поглощения их.
Я не понимаю, почему не использование Словаря (Словарь) (как предложено ageektrapped).
Вы хотите выполнить Мелкую Копию или Глубокую Копию? (то есть, оба Словаря, указывающие на те же ссылки или новые копии каждого объекта в новом словаре?)
, Если Вы хотите создать новый Словарь, указывающий новый объекты, я думаю, что единственный путь через foreach.
Для забавы я создал этот дополнительный метод к словарю. Это должно сделать глубокую копию по мере возможности.
public static Dictionary<TKey, TValue> DeepCopy<TKey,TValue>(this Dictionary<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;
}