Non è possibile specificare StringComparer
a 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.OrdinalIgnoreCase
quindi 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).