Немає можливості вказати 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).