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
, InvariantCultureIgnoreCase
ou CurrentCultureIgnoreCase
?
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
, InvariantCultureIgnoreCase
ou CurrentCultureIgnoreCase
?
À 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)
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:
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.
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.
MSDN fait quelques jolies de recommandations claires à ce sujet: http://msdn.microsoft.com/en-us/library/ms973919.aspx
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.
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 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.