StringComparer
在您尝试获取值的地方无法指定 a 。如果您考虑一下,"foo".GetHashCode()
并且"FOO".GetHashCode()
完全不同,那么没有合理的方法可以在区分大小写的哈希映射上实现不区分大小写的 get 。
但是,您可以首先使用以下方法创建不区分大小写的字典:-
var comparer = StringComparer.OrdinalIgnoreCase;
var caseInsensitiveDictionary = new Dictionary<string, int>(comparer);
或者使用现有区分大小写的字典的内容创建一个新的不区分大小写的字典(如果您确定没有大小写冲突):-
var oldDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var newDictionary = new Dictionary<string, int>(oldDictionary, comparer);
然后,这个新字典使用soGetHashCode()
上的实现并为您提供相同的值。StringComparer.OrdinalIgnoreCase
comparer.GetHashCode("foo")
comparer.GetHashcode("FOO")
或者,如果字典中只有几个元素,和/或您只需要查找一次或两次,则可以将原始字典视为 anIEnumerable<KeyValuePair<TKey, TValue>>
并对其进行迭代:-
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var value = myDictionary.FirstOrDefault(x => String.Equals(x.Key, myKey, comparer)).Value;
或者,如果您愿意,不使用 LINQ:-
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
int? value;
foreach (var element in myDictionary)
{
if (String.Equals(element.Key, myKey, comparer))
{
value = element.Value;
break;
}
}
这为您节省了创建新数据结构的成本,但作为回报,查找的成本是 O(n) 而不是 O(1)。