c#Dictionary:通过声明使Key不区分大小写

时间:2011-07-13 08:38:17

标签: c# dictionary case-insensitive

我有一个Dictionary<string, object>字典。它曾经是Dictionary<Guid, object>,但其他“标识符”已经发挥作用,而密钥现在作为字符串处理。

问题是我的源数据中的Guid个密钥来自VarChar,因此现在"923D81A0-7B71-438d-8160-A524EA7EFA5E"的密钥与"923d81a0-7b71-438d-8160-a524ea7efa5e"的密钥不同(wasn'使用Guids时出现问题。)

关于.NET框架的真正好处(和甜蜜)是我能做到的:

Dictionary<string, CustomClass> _recordSet = new Dictionary<string, CustomClass>(
    StringComparer.InvariantCultureIgnoreCase);

这很有效。但是嵌套字典怎么样?如下所示:

Dictionary<int, Dictionary<string, CustomClass>> _customRecordSet 
    = new  Dictionary<int, Dictionary<string, CustomClass>>();

如何在这样的嵌套字典中指定字符串比较器?

2 个答案:

答案 0 :(得分:77)

当您向外部字典添加元素时,您可能会创建嵌套字典的新实例,此时添加它,并使用IEqualityComparer<TKey> _customRecordSet.Add(0, new Dictionary<string, CustomClass>(StringComparer.InvariantCultureIgnoreCase));

StringComparer.OrdinalIgnoreCase


更新08/03/2017:有趣的是,我在某处读到(我认为在“编写高性能.NET代码”中),{{1}}只是在想忽视它时效率更高人物的情况。然而,这对YMMV来说完全没有根据。

答案 1 :(得分:8)

您必须初始化嵌套词典才能使用它们。只需使用上面的代码即可。

基本上,你应该有这样的代码:

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