C# Словарь: создание ключа без учета регистра с помощью объявлений
У меня есть Dictionary<string, object>
толковый словарь. Это было Dictionary<Guid, object>
но другие "идентификаторы" вошли в игру, и ключи теперь обрабатываются как строки.
Проблема в том, что Guid
ключи от моих исходных данных приходят как VarChar
теперь ключ "923D81A0-7B71-438d-8160-A524EA7EFA5E"
это не то же самое, что "923d81a0-7b71-438d-8160-a524ea7efa5e"
(не было проблем при использовании направляющих).
Что действительно хорошо (и приятно) в.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 ответа
Когда вы добавляете элемент во внешний словарь, вы, скорее всего, создадите новый экземпляр вложенного словаря, добавьте его на этом этапе, используя перегруженный конструктор, который принимает IEqualityComparer<TKey>
,
_customRecordSet.Add(0, new Dictionary<string, CustomClass>(StringComparer.InvariantCultureIgnoreCase));
Обновление 03/03/2017: В какой-то момент я где-то читал (я думаю, что в "Написание высокопроизводительного кода.NET"), что StringComparer.OrdinalIgnoreCase
более эффективно, если просто не обращать внимания на регистр символов. Это, однако, совершенно необоснованно для меня, так что YMMV.
Вам нужно будет инициализировать вложенные словари, чтобы использовать их. Просто используйте код, который у вас есть выше на тот момент.
По сути, у вас должен быть такой код:
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;
}
}