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

c# Dictionary: making the Key case-insensitive through declarations

我有一本Dictionary字典。它以前是Dictionary,但其他的"标识符"已经开始发挥作用,现在密钥被当作字符串处理。

问题是我的源数据中的Guid键作为VarChar来,所以现在"923D81A0-7B71-438d-8160-A524EA7EFA5E"的键与"923D81A0-7B71-438d-8160-A524EA7EFA5E"的键不同(使用guid时不是问题)。

.NET框架的真正优点(和优点)是我可以做到:

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

而且效果很好。但是嵌套字典呢?如下所示:

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

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


当您向外部字典添加元素时,您可能会创建嵌套字典的新实例,此时添加它,使用接收IEqualityComparer的重载构造函数。

_customRecordSet.Add(0, new Dictionary(StringComparer.InvariantCultureIgnoreCase));


更新日期:2017年3月8日:我在某个地方读到(我认为在"编写高性能.NET代码"中),当我只想忽略字符的情况时,StringComparer.OrdinalIgnoreCase的效率更高。然而,这完全是我自己没有根据的,所以YMMV。


为了使用嵌套字典,必须对它们进行初始化。只需使用上面提到的代码。

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

1
2
3
4
5
6
7
8
9
10
11
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;
    }
}