Não há como especificar a StringComparer
no ponto em que você tenta obter um valor. Se você pensar sobre isso "foo".GetHashCode()
e "FOO".GetHashCode()
for totalmente diferente, não haverá uma maneira razoável de implementar uma obtenção que não diferencia maiúsculas de minúsculas em um mapa de hash que diferencia maiúsculas de minúsculas.
No entanto, você pode criar um dicionário que não diferencia maiúsculas de minúsculas usando: -
var comparer = StringComparer.OrdinalIgnoreCase;
var caseInsensitiveDictionary = new Dictionary<string, int>(comparer);
Ou crie um novo dicionário que não diferencia maiúsculas de minúsculas com o conteúdo de um dicionário que diferencia maiúsculas de minúsculas existente (se tiver certeza de que não há colisão de maiúsculas e minúsculas): -
var oldDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var newDictionary = new Dictionary<string, int>(oldDictionary, comparer);
Este novo dicionário, em seguida, usa a GetHashCode()
implementação no StringComparer.OrdinalIgnoreCase
modo comparer.GetHashCode("foo")
e comparer.GetHashcode("FOO")
dar-lhe o mesmo valor.
Como alternativa, se houver apenas alguns elementos no dicionário e / ou você precisar pesquisar apenas uma ou duas vezes, poderá tratar o dicionário original como um IEnumerable<KeyValuePair<TKey, TValue>>
e apenas iterá-lo: -
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var value = myDictionary.FirstOrDefault(x => String.Equals(x.Key, myKey, comparer)).Value;
Ou, se preferir, sem o 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;
}
}
Isso economiza o custo de criação de uma nova estrutura de dados, mas, em troca, o custo de uma pesquisa é O (n) em vez de O (1).