С# Словарь: создание ключа без учета регистра посредством деклараций
У меня есть словарь Dictionary<string, object>
. Раньше он был Dictionary<Guid, object>
, но другие "идентификаторы" вступили в игру, и теперь клавиши обрабатываются как строки.
Проблема в том, что ключи Guid
из моих исходных данных поступают как VarChar
, поэтому теперь ключ "923D81A0-7B71-438d-8160-A524EA7EFA5E"
не совпадает с "923D81A0-7B71-438d-8160-A524EA7EFA5E"
(не было проблемой при использовании Guids).
Что действительно приятно (и сладко) в .NET Framework, что я могу это сделать:
Dictionary<string, CustomClass> _recordSet = new Dictionary<string, CustomClass>(
StringComparer.InvariantCultureIgnoreCase);
И это отлично работает. Но как насчет вложенного словаря? Как показано ниже:
Dictionary<int, Dictionary<string, CustomClass>> _customRecordSet
= new Dictionary<int, Dictionary<string, CustomClass>>();
Как я могу указать строковый сопоставитель для вложенного словаря следующим образом?
Ответы
Ответ 1
Когда вы добавляете элемент во внешний словарь, вы, скорее всего, создадите новый экземпляр вложенного словаря, добавьте его в этот момент, используя перегруженный конструктор overloaded constructor, который принимает IEqualityComparer<TKey>
.
_customRecordSet.Add(0, new Dictionary<string, CustomClass>(StringComparer.InvariantCultureIgnoreCase));
Обновление 03/03/2017: В какой-то момент я где-то прочитал (я думаю, что в "Написание высокопроизводительного кода .NET"), что StringComparer.OrdinalIgnoreCase
более эффективен, если просто не учитывать регистр символов. Это, однако, совершенно необоснованно для меня, так что YMMV.
Ответ 2
Вам нужно будет инициализировать вложенные словари, чтобы использовать их. Просто используйте код, который у вас выше в этот момент.
В принципе, у вас должен быть такой код:
public void insert(int int_key, string guid, CustomClass obj)
{
if (_customRecordSet.ContainsKey(int_key)
_customRecordSet[int_key][guid] = obj;
else
{
_customRecordSet[int_key] = new Dictionary<string, CustomClass>
(StringComparer.InvariantCultureIgnoreCase);
_customRecordSet[int_key][guid] = obj;
}
}