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

本文关键字:Key 不区 大小写 声明 字典 | 更新日期: 2023-09-27 18:01:51

我有一本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);

效果很好。但是嵌套字典呢?例如:

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

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

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

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

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


更新08/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;
    }
}