Non è possibile specificare StringComparera nel punto in cui si tenta di ottenere un valore. Se ci pensate, "foo".GetHashCode()e "FOO".GetHashCode()siete totalmente diversi, quindi non esiste un modo ragionevole per implementare un metodo senza distinzione tra maiuscole e minuscole su una mappa hash sensibile al maiuscolo / minuscolo.
È possibile, tuttavia, creare un dizionario senza distinzione tra maiuscole e minuscole utilizzando innanzitutto: -
var comparer = StringComparer.OrdinalIgnoreCase;
var caseInsensitiveDictionary = new Dictionary<string, int>(comparer);
Oppure crea un nuovo dizionario senza distinzione tra maiuscole e minuscole con i contenuti di un dizionario con distinzione tra maiuscole e minuscole esistente (se sei sicuro che non vi siano collisioni tra maiuscole e minuscole): -
var oldDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var newDictionary = new Dictionary<string, int>(oldDictionary, comparer);
Questo nuovo dizionario utilizza quindi l' GetHashCode()implementazione e StringComparer.OrdinalIgnoreCasequindi offre lo stesso valore.comparer.GetHashCode("foo")comparer.GetHashcode("FOO")
In alternativa, se ci sono solo pochi elementi nel dizionario e / o hai solo bisogno di cercare una o due volte, puoi considerare il dizionario originale come un IEnumerable<KeyValuePair<TKey, TValue>>semplice iterare su di esso: -
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var value = myDictionary.FirstOrDefault(x => String.Equals(x.Key, myKey, comparer)).Value;
O se preferisci, senza 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;
}
}
Ciò consente di risparmiare il costo di creazione di una nuova struttura di dati, ma in cambio il costo di una ricerca è O (n) anziché O (1).