Quand on compare deux chaînes en langage c# pour l’égalité, quelle est la différence entre InvariantCulture et comparaison ordinale ?
Réponses
Trop de publicités?Le "InvariantCulture" paramètre utilise un "standard" jeu de caractères des ordonnancements (a,b,c, etc...). Ceci est en contraste à certains endroits, ce qui peut les trier dans des ordres différents ("un-avec-aiguë peut être avant ou après le "a", selon les paramètres régionaux, et ainsi de suite).
"Ordinal" titre de comparaison, en revanche, semble purement à la valeur de l'octet brut(s) qui représentent le caractère. Il y a un grand échantillon à http://msdn.microsoft.com/en-us/library/e6883c06.aspx qui montre les résultats des différentes StringComparison valeurs. Tout le chemin à la fin, il montre (extrait):
StringComparison.InvariantCulture:
LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131)
LATIN SMALL LETTER I (U+0069) is less than LATIN CAPITAL LETTER I (U+0049)
LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U+0049)
StringComparison.Ordinal:
LATIN SMALL LETTER I (U+0069) is less than LATIN SMALL LETTER DOTLESS I (U+0131)
LATIN SMALL LETTER I (U+0069) is greater than LATIN CAPITAL LETTER I (U+0049)
LATIN SMALL LETTER DOTLESS I (U+0131) is greater than LATIN CAPITAL LETTER I (U+0049)
Vous pouvez voir que là où InvariantCulture rendements (U+0069, U+0049, U+00131), Ordinale, les rendements (U+0049, U+0069, U+00131).
Pointant vers les Meilleures Pratiques pour l'Utilisation des Chaînes dans le .NET Framework:
- Utiliser
StringComparison.Ordinal
ouStringComparison.OrdinalIgnoreCase
pour les comparaisons que votre sécurité par défaut pour la culture-agnostique correspondance de chaîne. - Utilisez la comparaison avec
StringComparison.Ordinal
ouStringComparison.OrdinalIgnoreCase
pour de meilleures performances. - L'utilisation de la non-linguistiques
StringComparison.Ordina
l ouStringComparison.OrdinalIgnoreCase
valeurs à la place des opérations de la chaîne basée surCultureInfo.InvariantCulture
lorsque la comparaison est linguistiquement pertinentes (symbolique, par exemple).
Et enfin:
-
N'utilisez pas la chaîne des opérations basées sur
StringComparison.InvariantCulture
dans la plupart des cas. Une des rares exceptions, c'est quand vous êtes persistant linguistiques significatives, mais culturellement agnostique de données.
Une autre pratique de la différence (en anglais où les accents sont rare), c'est qu'une InvariantCulture comparaison compare l'ensemble des chaînes par de la casse, d'abord, et ensuite, si nécessaire (et demandé) se distingue par cas après la première comparaison sur les différentes lettres. (Vous pouvez également faire une comparaison sensible à la casse, bien sûr, qui ne distinguent par cas.) Corrigé: les lettres Accentuées sont considérés comme une autre saveur de la même lettres et de la chaîne est de commencer par ignorer les accents, puis de la comptabilité pour eux si les lettres générales tous les match (un peu comme avec les différents cas sauf finalement pas ignoré dans une casse comparer). Ce groupe a accentué les versions de l'autre même mot près les uns des autres, au lieu de séparer complètement lors de la première différence d'accent. C'est l'ordre de tri vous pouvez généralement trouver dans un dictionnaire, les mots avec des majuscules apparaissant juste à côté de leurs minuscules équivalents, et les lettres accentuées en étant à proximité de la lettre non accentuée correspondante.
Une comparaison ordinale compare strictement sur le caractère numérique des valeurs, en s'arrêtant à la première différence. Il trie des lettres en majuscule complètement distincte des lettres minuscules (et les lettres accentuées et sans doute distincte de ceux-ci), donc en majuscule les mots qui sorte de nulle part à proximité de leurs minuscules équivalents.
InvariantCulture estime également capitales pour être plus grande que la baisse des cas, alors que Ordinale considère capitales à moins de minuscules (un vestige de l'ASCII à partir de l'ancien des jours avant que les ordinateurs avaient des lettres minuscules, les lettres majuscules ont été attribuées en priorité et donc des valeurs plus faibles que les lettres minuscules ajouté plus tard).
Par exemple, en Ordinale: "0" < "9" < "Un" < "Ab" < "Z" < "a" < "aB" < "ab" < "z" < "Á" < "Áb" < "á" < "áb"
Et par InvariantCulture: "0" < "9" < "un" < "A" < "á" < "Á" < "ab" < "aB" < "Ab" < "áb" < "Áb" < "z" < "Z"
Invariant est un type de comparaison linguistique approprié.
Ordinal est un type binaire de comparaison. (plus rapide)
Voir http://blogs.msdn.com/b/michkap/archive/2004/12/29/344136.aspx