2008-10-09 8 views
19

Si je veux avoir un dictionnaire-clé chaîne insensible à la casse, la version de StringComparer dois-je utiliser compte tenu de ces contraintes:Quelle version de StringComparer à utiliser

  • Les clés du dictionnaire proviennent soit du code C# ou les fichiers de configuration écrits en anglais seulement locale (soit US ou UK)
  • le logiciel est internationalisé et se déroulera dans différents lieux

J'utilise normalement StringComparer.InvariantCultureIgnoreCase mais ne sais pas si c'est le bon Cas. Voici un exemple de code:

Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase); 

Répondre

11

This MSDN article couvre tout ce que vous pourriez avoir envie de connaître en profondeur, y compris le problème turc-I.

Ça fait longtemps que je ne l'ai pas lu, alors je vais recommencer. On se voit dans une heure!

1

Depuis les touches sont vos valeurs fixes connues, alors soit InvariantCultureIgnoreCase ou OrdinalIgnoreCase devraient fonctionner. Évitez la culture spécifique, ou vous pourriez frapper certaines des choses les plus «amusantes» comme le problème «turc». De toute évidence, vous utiliseriez un comparateur de culture si vous compariez des valeurs cultivées ... mais il semble que ce ne soit pas le cas.

3

Le concept de "case insensible" est un concept linguistique, et donc il n'a pas de sens sans une culture. Pour plus d'informations, voir blog. Cela dit, si vous parlez juste de chaînes utilisant l'alphabet latin, vous aurez probablement partir avec l'InvariantCulture.

Cependant, il est probablement préférable de créer le dictionnaire avec StringComparer.CurrentCulture. Cela permettra à "ß" de faire correspondre "ss" dans votre dictionnaire avec une culture allemande, par exemple.

1

StringComparer.OrdinalIgnoreCase est légèrement plus rapide que InvariantCultureIgnoreCase FWIW (« Une comparaison ordinale est rapide, mais la culture insensible à la casse », selon MSDN.

Il faudrait faire beaucoup de comparaisons à remarquer la différence de Bien sûr.

0

la Invariant culture existe pour traiter spécifiquement des chaînes qui sont internes au programme et qui ont rien à voir avec les données utilisateur ou l'interface utilisateur. Il semble que cela est le cas pour cette situation.

27

Il y a trois types de comparateurs:

  • Culture-aware
  • Culture invariante
  • ordinal

Chaque comparateur a un sensible à la casse ainsi qu'un insensible à la casse la version.

Un ordinal Le comparateur utilise des valeurs ordinales de caractères. C'est le comparateur le plus rapide, il devrait être utilisé à des fins internes.

A conscient de la culture aspects considère comparateur propres à la culture du thread courant. Il connaît le "turc je", "espagnol LL", etc problèmes. Il devrait être utilisé pour les chaînes d'interface utilisateur.Le invariant de culture n'est en fait pas défini et peut produire des résultats imprévisibles, et ne devrait donc jamais être utilisé du tout.

Références

  1. New Recommendations for Using Strings in Microsoft .NET 2.0
+0

C'était un cas où je préfère la culture invariante quand regarder dans db .. – nawfal

0

System.Collections.Specialized inclut StringDictionary. La section Remarques du MSDN indique « Une clé ne peut être nulle, mais une boîte de valeur

La clé est traitée de manière insensible à la casse;. Il est traduit en minuscules avant d'être utilisé avec le dictionnaire de chaîne

.

Dans .NET Framework version 1.0, cette classe utilise des comparaisons de chaînes sensibles à la culture, mais dans la version 1.1 et ultérieure du .NET Framework, cette classe utilise CultureInfo.InvariantCulture pour comparer les chaînes. voir Comparaison et tri des données pour une culture spécifique et effectuer des opérations de chaînes insensibles à la culture

Questions connexes