С# Словарь: создание ключа без учета регистра посредством деклараций

У меня есть словарь 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;
    }
}