Словарь KeyNotFoundException, хотя ключ существует - PullRequest
2 голосов
/ 22 марта 2012

У меня есть RegistryKey в качестве ключа для моего словаря.

Я не могу установить значение для этого конкретного ключа. Что бы я ни делал, я продолжаю получать KeyNotFoundException. Ключ существует, я создал его на одну строку раньше

например:

public Dictionary<RegistryKey, Dictionary<string, object>> subKeyNodes = new...
subKeyNodes.Add(mainKeyNode.CreateSubKey(keyName),new Dictionary<string, object>());
subKeyNodes[mainKeyNode.CreateSubKey(keyName)].Add("ROAR", "value");

Адд работает нормально. Добавление с этим значением ключа всегда терпит неудачу, и я не могу понять это.

Ответы [ 3 ]

4 голосов
/ 22 марта 2012

Гораздо лучший способ - предоставить что-то, что реализует IEqualityComparer<RegistryKey> для конструктора Словаря - таким образом, вам не нужно оборачивать каждый объект.

2 голосов
/ 22 марта 2012

RegistryKey не имеет ни переопределения GetHashCode, ни Equals.Это означает, что экземпляры RegistryKey будут использовать реализацию по умолчанию (определенную в Object).Из-за этого два экземпляра RegistryKey не будут идентифицированы как «равные», даже если их поля одинаковы.Это означает, что вы не можете использовать экземпляры этого класса в качестве ключа для хешированных коллекций, таких как Dictionary или HashSet.

. В качестве обходного пути вы можете определить другой класс, который переносит RegistryKey и определяет эти методыпереопределение.

1 голос
/ 22 марта 2012

CreateSubKey предположительно возвращает новый экземпляр объекта каждый раз, когда вы вызываете его.Таким образом, его повторный вызов даст вам разные объекты (даже если они могут ссылаться на один и тот же ключ реестра).Вы должны сохранить результат первого вызова CreateSubKey вместо повторного вызова.Или используйте имя ключа вместо объекта в качестве ключа вашего словаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...