Там нет никакого способа указать StringComparer
в точке, где вы пытаетесь получить значение. Если вы думаете об этом, "foo".GetHashCode()
и "FOO".GetHashCode()
все совершенно по-другому, то нет никакого разумного способа реализовать регистронезависимое попадание на чувствительную к регистру хэш-карту.
Однако вы можете создать словарь без учета регистра в первую очередь, используя: -
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);
Этот новый словарь затем использует GetHashCode()
реализацию StringComparer.OrdinalIgnoreCase
так comparer.GetHashCode("foo")
и comparer.GetHashcode("FOO")
дает вам то же значение.
В качестве альтернативы, если в словаре всего несколько элементов и / или вам нужно искать только один или два раза, вы можете рассматривать исходный словарь как 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).