715 votes

Différence entre InvariantCulture et Comparaison de chaînes ordinales

Quand on compare deux chaînes en langage c# pour l’égalité, quelle est la différence entre InvariantCulture et comparaison ordinale ?

372voto

Bond Points 2145

Il importe, par exemple - il y a un truc qui s’appelle expansion de caractère

dans cet exemple compOrdinal aura la valeur false, mais compCulture est vrai !

C’est parce que dans le ß personnage obtient étendu aux ss.

371voto

JaredReisinger Points 2883

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).

167voto

Dariusz Points 2845

Pointant vers les Meilleures Pratiques pour l'Utilisation des Chaînes dans le .NET Framework:

  • Utiliser StringComparison.Ordinal ou StringComparison.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 ou StringComparison.OrdinalIgnoreCase pour de meilleures performances.
  • L'utilisation de la non-linguistiques StringComparison.Ordinal ou StringComparison.OrdinalIgnoreCase valeurs à la place des opérations de la chaîne basée sur CultureInfo.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.

63voto

Rob Parker Points 1674

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"

32voto

DanH Points 368

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

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