Quel est généralement préférable d'utiliser - StringComparison.OrdinalIgnoreCase ou StringComparison.InvariantCultureIgnoreCase?

StackOverflow https://stackoverflow.com/questions/72696

  •  09-06-2019
  •  | 
  •  

Question

J'ai un code comme celui-ci:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

Je me fiche de l'affaire. Devrais-je utiliser OrdinalIgnoreCase , InvariantCultureIgnoreCase ou CurrentCultureIgnoreCase ?

Était-ce utile?

La solution

Les documents .Net les plus récents disposent désormais d’un tableau qui vous aide à choisir celle qui convient le mieux à votre situation.

A partir de MSDN & Nouvelles recommandations pour l’utilisation de chaînes dans Microsoft .NET 2.0 "

  

Résumé: les propriétaires de code qui utilisaient auparavant InvariantCulture pour la comparaison, le casage et le tri des chaînes devraient fortement envisager l'utilisation d'un nouvel ensemble de surcharges String dans Microsoft .NET 2.0. Plus précisément, les données conçues pour être indépendantes de la culture et sans pertinence linguistique doivent commencer à spécifier les surcharges à l'aide des membres StringComparison.Ordinal ou StringComparison.OrdinalIgnoreCase . de la nouvelle énumération StringComparison . Celles-ci imposent une comparaison octet par octet, similaire à strcmp , qui évite non seulement les bogues liés à l'interprétation linguistique de chaînes essentiellement symboliques, mais offre de meilleures performances.

Autres conseils

Tout dépend

Il est difficile de comparer les chaînes unicode:

  

L'implémentation de la chaîne Unicode   recherches et comparaisons en texte   logiciel de traitement doit prendre en compte   tenir compte de la présence d'équivalent   points de code. En l'absence de cela   fonctionnalité, les utilisateurs recherchant un   séquence de points de code particulière serait   être incapable de trouver d'autres personnes visuellement   glyphes indiscernables qui ont un   différent, mais canoniquement équivalent,   représentation des points de code.

voir: http://en.wikipedia.org/wiki/Unicode_equivalence

Si vous essayez de comparer 2 chaînes unicode sans tenir compte de la casse et que vous souhaitez que cela fonctionne PARTOUT , vous avez un problème impossible.

L'exemple classique est le turc i , qui, une fois placé en majuscule, devient & # 304; (remarquez le point)

Par défaut, le framework .Net utilise généralement le CurrentCulture pour les fonctions liées aux chaînes, à l'exception très importante de .Equals , qui utilise une comparaison ordinale (octet par octet).

Cela a pour conséquence que les différentes fonctions de chaîne se comportent différemment en fonction de la culture de l'ordinateur.

Néanmoins, nous souhaitons parfois une comparaison "à usage général", insensible à la casse.

Par exemple, vous pouvez souhaiter 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:

  1. Définissez la culture de manière explicite et effectuez une comparaison sans distinction de casse à l'aide de règles d'équivalence Unicode.
  2. Définissez la culture sur la culture invariante et effectuez des comparaisons sans distinction de casse à l'aide de règles d'équivalence Unicode.
  3. Utilisez OrdinalIgnoreCase pour mettre la chaîne en majuscule à l'aide de InvariantCulture puis effectuez une comparaison octet par octet.
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 n'effectue aucune normalisation unicode spéciale signifie que certaines chaînes qui s'affichent de la même manière sur un écran d'ordinateur, ne seront pas considérées comme identiques. Par exemple: "\ u0061 \ u030a" et "\ u00e5" sont tous deux rendus & # 229 ;. Cependant, dans une comparaison ordinale sera considéré comme différent.

Le choix que vous choisissez dépend fortement de l’application que vous construisez.

  • Si j'écrivais une application métier utilisée uniquement par des utilisateurs turcs, je serais sûr d'utiliser la méthode 1.
  • Si je voulais juste un simple "faux" comparez en respectant la casse, par exemple un nom de colonne dans une base de données, qui est généralement en anglais, j'utiliserais probablement la méthode 3.

Microsoft a son ensemble de recommandations avec des instructions explicites. Cependant, il est vraiment important de comprendre la notion d’équivalence Unicode avant d’aborder ces problèmes.

N'oubliez pas non plus qu'OrdinalIgnoreCase est un type très spécial de la bête, c’est cueillir et choisir un peu un ordinale par rapport à certains aspects lexicographiques mélangés. Cela peut être déroutant.

MSDN formule des recommandations très claires à ce sujet: http://msdn.microsoft .com / fr-us / library / ms973919.aspx

Je suppose que cela dépend de votre situation. Étant donné que les comparaisons ordinales examinent les valeurs Unicode numériques des caractères, elles ne constitueront pas le meilleur choix lorsque vous effectuez un tri alphabétique. Pour les comparaisons de chaînes, cependant, ordinal serait un peu plus rapide.

Cela dépend de ce que vous voulez, même si je craindrais la culture invariante à moins que vous ne soyez très sûr que vous ne voudrez jamais localiser le code dans d'autres langues. Utilisez plutôt CurrentCulture.

OrdinalIgnoreCase doit également respecter les chiffres, que vous souhaitiez ou non.

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 ()?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top