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

MoS*_*Slo 70 c# dictionary case-insensitive

我有一Dictionary<string, object>本字典.它曾经是,Dictionary<Guid, object>但其他"标识符"已经发挥作用,键现在作为字符串处理.

问题是Guid来自我的源数据VarChar的密钥"923D81A0-7B71-438d-8160-A524EA7EFA5E"是,所以现在一个密钥不一样"923d81a0-7b71-438d-8160-a524ea7efa5e"(使用Guids时不是问题).

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

Dictionary<string, CustomClass> _recordSet = new Dictionary<string, CustomClass>(
    StringComparer.InvariantCultureIgnoreCase);
Run Code Online (Sandbox Code Playgroud)

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

Dictionary<int, Dictionary<string, CustomClass>> _customRecordSet 
    = new  Dictionary<int, Dictionary<string, CustomClass>>();
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*rth 77

当您添加一个元素外字典,你很可能会创建嵌套字典的新实例,将其添加在这一点上,使得使用的重载的构造函数接受一个IEqualityComparer<TKey>.

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


更新08/03/2017:有趣的是,我在某处读到(我认为在"编写高性能.NET代码"中),StringComparer.OrdinalIgnoreCase只是想忽略字符的情况时更有效率.然而,这对YMMV来说完全没有根据.


Pat*_*ick 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;
    }
}
Run Code Online (Sandbox Code Playgroud)