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

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

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

32022 次浏览

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

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


更新08/03/2017: 有趣的是,我在某处读到(我认为在“写高性能。NET Code”) ,当只想忽略字符的大小写时,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;
}
}