在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);
然后,此新词典使用so 的GetHashCode()
实现,并为您提供相同的值。StringComparer.OrdinalIgnoreCase
comparer.GetHashCode("foo")
comparer.GetHashcode("FOO")
或者,如果字典中只有几个元素,并且/或者您只需要查找一次或两次,则可以将原始字典视为an IEnumerable<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)。