337 votes

Accès insensible à la casse pour dictionnaire générique

J'ai une application qui utilisent géré dll. L'un de ces dll retour un dictionnaire générique:

Dictionary<string, int> MyDictionary;  

Le dictionnaire contient les touches avec les majuscules et les minuscules.

D'un autre côté, j'obtiens une liste de clés (string) cependant, je ne garantit pas le cas. Je suis en train d'essayer d'obtenir la valeur dans le dictionnaire à l'aide des touches. Mais bien sûr, la suite va échouer car j'ai un cas d'incompatibilité:

bool Success = MyDictionary.TryGetValue( MyIndex, out TheValue );  

J'espérais que le TryGetValue aurait un cas ignorer drapeau comme mentionné dans la doc MSDN, mais il semble que ce n'est pas valable pour les dictionnaires génériques.

Est-il possible d'obtenir la valeur de ce dictionnaire en ignorant la clé de l'affaire? Est-il une meilleure solution que de créer une nouvelle copie du dictionnaire avec le bon StringComparer.OrdinalIgnoreCase paramètre?

707voto

Iain Galloway Points 6588

Il n'y a aucun moyen de spécifier un StringComparer au point où vous essayez d'obtenir une valeur. Si vous pensez à ce sujet, "Foo".GetHashCode() et "foo".GetHashCode() sont totalement différentes donc il n'y a aucun moyen raisonnable vous pouvez implémenter un casse obtenir sur une casse de hachage de la carte.

Vous pouvez, toutefois, créer un de la casse, dictionnaire en premier lieu à l'aide de:-

MyDictionary = new Dictionary<string, int>(
  StringComparer.OrdinalIgnoreCase);

(Ce dictionnaire utilise ensuite l' GetHashCode() mise en œuvre sur StringComparer.OrdinalIgnoreCase tels que comparer.GetHashCode("Foo") et comparer.GetHashcode("foo") vous donner la même valeur)

Combien de fois avez-vous besoin pour obtenir le dictionnaire de votre dépendance? Si vous obtenez seulement une fois, vous pouvez très facilement créer un nouveau casse dictionnaire avec le contenu de l'ancien:-

MyDictionary = new Dictionary<string, int>(
  MyDictionary, StringComparer.OrdinalIgnoreCase);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X