209 votes

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

J'ai un code comme ceci:

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

Je ne se soucient pas le cas. Dois-je utiliser OrdinalIgnoreCase, InvariantCultureIgnoreCaseou CurrentCultureIgnoreCase?

223voto

Robert Taylor Points 1008

À partir de MSDN "Nouvelles Recommandations pour l'Utilisation des Chaînes de Microsoft .NET 2.0"

Résumé: le Code de propriétaires précédemment à l'aide de la InvariantCulture de comparaison de chaîne, le boîtier et le tri devrait fortement envisager l'utilisation d'une nouvelle série de la Chaîne des surcharges de Microsoft .NET 2.0. Plus précisément, les données qui est conçu pour être culture agnostique et linguistiquement non pertinentes devraient commencer à spécifier les surcharges en utilisant soit le StringComparison.Ordinale ou StringComparison.OrdinalIgnoreCase membres de la nouvelle StringComparison énumération. Le respect des règles d'un octet-par-octet comparaison similaire à strcmp qui non seulement évite les bugs de l'interprétation linguistique de essentiellement symbolique des chaînes, mais offre de meilleures performances. (15 pages)

73voto

Sam Saffron Points 56236

Tout dépend de la

La comparaison des chaînes unicode est dur:

La mise en œuvre de chaîne Unicode les recherches et les comparaisons dans le texte logiciel de traitement doit prendre en compte de la présence de l'équivalent les points de code. En l'absence de cette fonctionnalité, les utilisateurs à la recherche d'un notamment du point de code séquence s' être incapable de trouver d'autres visuellement impossible de distinguer les glyphes qui ont un différentes, mais canoniquement équivalente, point de code de représentation.

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


Si vous essayez de comparer 2 chaînes unicode dans une casse moyen et voulez qu'il fonctionne PARTOUT, vous avez un problème impossible.

L'exemple classique est le turc-je, qui, lorsqu'il en majuscule devient I (notez le point)

Par défaut, l' .Net framework utilise généralement le CurrentCulture pour la chaîne de fonctions connexes, avec une exception très importante de l' .Equals qui utilise un nombre ordinal (octet par octet) comparer.

Cela conduit, de par leur conception, les différentes fonctions de chaîne se comporter différemment en fonction de l'ordinateur de la culture.


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

Par exemple, vous pourriez voulez que votre comparaison de chaîne à se comporter de la même manière, n'importe quel ordinateur de votre application est installée sur.

Pour ce faire nous avons 3 options:

  1. Définir la culture explicitement et d'effectuer un casse comparer unicode à l'aide de règles d'équivalence.
  2. Définir la culture de l'Invariant de la Culture et effectuer casse comparer unicode à l'aide de règles d'équivalence.
  3. Utilisation OrdinalIgnoreCase qui en majuscules la chaîne à l'aide de la InvariantCulture, puis effectuer une comparaison octet par octet.

Unicode équivalence règles sont compliquées, ce qui signifie que l'aide de la méthode 1) ou 2) est plus cher que l' OrdinalIgnoreCase. Le fait qu' OrdinalIgnoreCase ne pas effectuer toute spéciale de normalisation unicode, signifie que certaines chaînes qui rendent de la même manière sur un écran d'ordinateur, ne va pas être considérées comme identiques. Par exemple: "\u0061\u030a" et "\u00e5" à la fois de rendre å. Cependant, dans un ordinal comparer seront considérés comme différents.

Que vous choisissez dépend fortement de l'application que vous créez.

  • Si j'ai écrit un line-of-business application qui a été utilisé uniquement par les utilisateurs turcs, je voudrais être sûr d'utiliser la méthode 1.
  • Si j'avais juste besoin d'un simple "faux" insensible à la casse comparer, pour dire le nom d'une colonne dans une db, ce qui est généralement l'anglais je serais probablement utiliser la méthode 3.

Microsoft a leur série de recommandations avec des lignes directrices explicites. Cependant, il est vraiment important de comprendre la notion de l'unicode équivalence avant l'approche de ces problèmes.

Veuillez également garder à l'esprit que OrdinalIgnoreCase est un genre très spécial de la bête, c'est la cueillette et le choix un peu d'un ordinal comparer avec un mélange à lexicographique aspects. Cela peut être source de confusion.

8voto

chessguy Points 808

MSDN fait quelques jolies de recommandations claires à ce sujet: http://msdn.microsoft.com/en-us/library/ms973919.aspx

4voto

Bullines Points 2541

Je suppose que cela dépend de votre situation. Depuis ordinale comparaisons sont en fait en regardant les personnages numérique des valeurs Unicode, ils ne sont pas le meilleur choix lorsque vous êtes de tri par ordre alphabétique. Pour les comparaisons de chaînes, bien que, ordinale, serait un peu plus vite.

1voto

Joel Coehoorn Points 190579

Cela dépend de ce que vous voulez, si j'étais timide loin de invariantculture sauf si vous êtes très sûr que vous ne voudrez plus jamais à localiser le code pour d'autres langues. Utilisation CurrentCulture à la place.

Aussi, OrdinalIgnoreCase doivent respecter des numéros, ce qui peut ou peut ne pas être ce que vous voulez.

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