J'ai un code comme celui-ci:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Je me fiche de l'affaire. Dois - je utiliser OrdinalIgnoreCase
, InvariantCultureIgnoreCase
ou CurrentCultureIgnoreCase
?
J'ai un code comme celui-ci:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
Je me fiche de l'affaire. Dois - je utiliser OrdinalIgnoreCase
, InvariantCultureIgnoreCase
ou CurrentCultureIgnoreCase
?
Réponses:
Extrait des « Nouvelles recommandations pour l'utilisation de chaînes dans Microsoft .NET 2.0 » de MSDN
Résumé: Les propriétaires de code utilisant précédemment
InvariantCulture
pour la comparaison de chaînes, la casse et le tri doivent fortement envisager d'utiliser un nouvel ensemble deString
surcharges dans Microsoft .NET 2.0. Plus précisément, les données qui est conçu pour être la culture agnostique et linguistiquement non pertinentes devraient commencer spécifier en utilisant soit le surchargeStringComparison.Ordinal
ou lesStringComparison.OrdinalIgnoreCase
membres du nouveauStringComparison
énumération. Ceux-ci imposent une comparaison octet par octet similaire àstrcmp
celle qui évite non seulement les bogues d'interprétation linguistique de chaînes essentiellement symboliques, mais offre de meilleures performances.
"Straße"
et "STRASSE"
. Lors de l'utilisation OrdinalIgnoreCase
des Equals
retours false
, alors que InvariantCultureIgnoreCase
dit qu'ils sont égaux.
La comparaison des chaînes Unicode est difficile:
La mise en œuvre des recherches et comparaisons de chaînes Unicode dans les logiciels de traitement de texte doit prendre en compte la présence de points de code équivalents. En l'absence de cette fonctionnalité, les utilisateurs recherchant une séquence de points de code particulière seraient incapables de trouver d'autres glyphes visuellement indiscernables qui ont une représentation de point de code différente, mais canoniquement équivalente.
voir: http://en.wikipedia.org/wiki/Unicode_equivalence
Si vous essayez de comparer 2 chaînes Unicode de manière insensible à la casse et que vous souhaitez que cela fonctionne PARTOUT , vous avez un problème impossible.
L'exemple classique est le turc je , qui lorsqu'il est mis en majuscule devient İ (notez le point)
Par défaut, le framework .Net utilise généralement la CurrentCulture pour les fonctions liées aux chaînes, avec une exception très importante .Equals
qui utilise une comparaison ordinale (octet par octet).
Cela conduit, de par sa conception, à ce que les différentes fonctions de chaîne se comportent différemment selon la culture de l'ordinateur.
Néanmoins, nous voulons parfois une comparaison «à usage général», insensible à la casse.
Par exemple, vous souhaiterez peut-être que votre comparaison de chaînes se comporte de la même manière, quel que soit l'ordinateur sur lequel votre application est installée.
Pour y parvenir, nous avons 3 options:
Les règles d'équivalence Unicode sont compliquées, ce qui signifie que l'utilisation de la méthode 1) ou 2) est plus coûteuse que OrdinalIgnoreCase
. Le fait que OrdinalIgnoreCase
cela n'effectue aucune normalisation Unicode spéciale signifie que certaines chaînes qui sont rendues de la même manière sur un écran d'ordinateur ne seront pas considérées comme identiques. Par exemple: "\u0061\u030a"
et les "\u00e5"
deux rendent å. Cependant, une comparaison ordinale sera considérée comme différente.
Le choix que vous choisissez dépend fortement de l'application que vous créez.
Microsoft a son ensemble de recommandations avec des directives explicites. Cependant, il est vraiment important de comprendre la notion d'équivalence unicode avant d'aborder ces problèmes.
Aussi, gardez à l'esprit que OrdinalIgnoreCase est un type très spécial de bête, qui cueille et choisit un peu un ordinal comparé à certains aspects lexicographiques mixtes. Cela peut être déroutant.
Je suppose que cela dépend de votre situation. Étant donné que les comparaisons ordinales examinent en fait les valeurs Unicode numériques des caractères, elles ne seront pas le meilleur choix lorsque vous triez par ordre alphabétique. Pour les comparaisons de chaînes, cependant, l'ordinal serait un peu plus rapide.
Cela dépend de ce que vous voulez, même si j'éviterais la culture invariante sauf si vous êtes très sûr que vous ne voudrez plus jamais localiser le code pour d' autres langues. Utilisez plutôt CurrentCulture.
En outre, OrdinalIgnoreCase doit respecter les nombres, qui peuvent ou non être ce que vous voulez.
La réponse très simple est que, sauf si vous utilisez le turc, vous n'avez pas besoin d'utiliser InvariantCulture.
Voir le lien suivant:
En C # quelle est la différence entre ToUpper () et ToUpperInvariant ()?