No hay forma de especificar un StringComparer
en el punto donde intenta obtener un valor. Si lo piensa, "foo".GetHashCode()
y "FOO".GetHashCode()
es totalmente diferente, por lo que no hay una forma razonable de implementar un get que no distinga entre mayúsculas y minúsculas en un mapa hash sensible a mayúsculas y minúsculas.
Sin embargo, puede crear un diccionario que no distinga entre mayúsculas y minúsculas en primer lugar usando:
var comparer = StringComparer.OrdinalIgnoreCase;
var caseInsensitiveDictionary = new Dictionary<string, int>(comparer);
O cree un nuevo diccionario que no distinga mayúsculas de minúsculas con el contenido de un diccionario existente que distinga mayúsculas de minúsculas (si está seguro de que no hay colisiones de mayúsculas y minúsculas):
var oldDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var newDictionary = new Dictionary<string, int>(oldDictionary, comparer);
Este nuevo diccionario luego usa la GetHashCode()
implementación enStringComparer.OrdinalIgnoreCase
so comparer.GetHashCode("foo")
y le comparer.GetHashcode("FOO")
da el mismo valor.
Alternativamente, si solo hay unos pocos elementos en el diccionario, y / o solo necesita buscar una o dos veces, puede tratar el diccionario original como un IEnumerable<KeyValuePair<TKey, TValue>>
y simplemente iterar sobre él: -
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var value = myDictionary.FirstOrDefault(x => String.Equals(x.Key, myKey, comparer)).Value;
O si lo prefiere, sin el 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;
}
}
Esto le ahorra el costo de crear una nueva estructura de datos, pero a cambio el costo de una búsqueda es O (n) en lugar de O (1).