c # Словарь: создание ключа без учета регистра с помощью объявлений - PullRequest
70 голосов
/ 13 июля 2011

У меня есть 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>>();

Как бы я указал для сравнения строк во вложенном словаре, как это?

Ответы [ 2 ]

77 голосов
/ 13 июля 2011

Когда вы добавляете элемент во внешний словарь, вы, скорее всего, создадите новый экземпляр вложенного словаря, добавьте его в этот момент, используя перегруженный конструктор , который принимает IEqualityComparer<TKey>.

_customRecordSet.Add(0, new Dictionary<string, CustomClass>(StringComparer.InvariantCultureIgnoreCase));

Обновление 08/03/2017: Неожиданно я где-то читал (я думаю, что в «Написание высокопроизводительного кода .NET»), что StringComparer.OrdinalIgnoreCase более эффективен, если просто не обращать внимания на случайперсонажи.Это, однако, совершенно необоснованно для меня, так что YMMV.

8 голосов
/ 13 июля 2011

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

По сути, у вас должен быть такой код:

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;
    }
}
...