Classe SortKey

Cet article contient des remarques complémentaires à la documentation de référence pour cette API.

Une comparaison de deux chaînes respectant la culture dépend du fait que chaque caractère dans les chaînes a plusieurs catégories de pondérations de tri, dont les pondérations de script, d’alphabet, de casse et diacritiques. Une clé de tri sert de référentiel de ces pondérations pour une chaîne particulière.

La méthode CompareInfo.GetSortKey retourne une instance de la classe SortKey qui reflète le mappage respectant la culture des caractères dans une chaîne spécifiée. La valeur d’un objet SortKey est ses données de clé, qui sont retournées par la propriété KeyData. Ces données de clé se composent d’une série d’octets qui constituent une codification de la chaîne, des règles de tri spécifiques à la culture et des options de comparaison spécifiées par l’utilisateur. Une comparaison effectuée en utilisant des clés de tri consiste en une comparaison au niveau du bit des données de clé correspondantes dans chaque clé de tri. Par exemple, si vous créez une clé de tri en appelant la méthode GetSortKey(String, CompareOptions) avec une valeur de CompareOptions.IgnoreCase, une opération de comparaison de chaînes qui utilise la clé de tri ne respecte pas la casse.

Après avoir créé une clé de tri pour une chaîne, vous comparez les clés de tri en appelant la méthode statique SortKey.Compare. Cette méthode effectue une simple comparaison octet par octet : elle est donc bien plus rapide que la méthode String.Compare ou CompareInfo.Compare.

Remarque

Vous pouvez télécharger les Tables des pondérations pour le tri, un ensemble de fichiers texte qui contiennent des informations sur les pondérations des caractères utilisées dans les opérations de tri et de comparaison pour les systèmes d’exploitation Windows et la Table des éléments du classement Unicode par défaut, la table des pondérations pour le tri pour Linux et macOS.

Considérations relatives aux performances

Lors de la réalisation d’une comparaison de chaînes, les méthodes Compare et CompareInfo.Compare produisent les mêmes résultats, mais ils ciblent des scénarios différents.

Globalement, la méthode CompareInfo.Compare génère la clé de tri pour chaque chaîne, effectue la comparaison, puis supprime la clé de tri et retourne le résultat de la comparaison. Cependant, la méthode CompareInfo.Compare ne génère en fait pas de clé de tri entière pour effectuer la comparaison. Au lieu de cela, la méthode génère les données de clé pour chaque élément texte (c’est-à-dire un caractère de base, une paire de substitution ou une séquence de caractères combinés) dans chaque chaîne. La méthode compare ensuite les données de clé pour les éléments texte correspondants. L’opération se termine dès que le résultat final de la comparaison est déterminé. Les informations de la clé de tri sont calculées, mais aucun objet SortKey n’est créé. Cette stratégie est économique en termes de performances si les deux chaînes sont comparées une seule fois, mais elle devient coûteuse si les mêmes chaînes sont comparées à de nombreuses reprises.

La méthode Compare nécessite la génération d’un objet SortKey pour chaque chaîne avant d’effectuer la comparaison. Cette stratégie est coûteuse en termes de performances pour la première comparaison en raison du temps et de la mémoire nécessaires pour générer les objets SortKey. Elle devient cependant économique si les mêmes clés de tri sont comparées à de nombreuses reprises.

Par exemple, supposons que vous écrivez une application qui recherche dans une table de base de données la ligne où la colonne d’un index de type chaîne correspond à une chaîne de recherche spécifiée. La table contient des milliers de lignes et la comparaison de la chaîne de recherche à l’index dans chaque ligne prend beaucoup de temps. Par conséquent, lorsque l’application stocke une ligne et sa colonne d’index, elle génère et stocke également la clé de tri pour l’index dans une colonne dédiée à l’amélioration des performances de la recherche. Lorsque l’application recherche une ligne cible, elle compare la clé de tri de la chaîne de recherche à la clé de tri de la chaîne de l’index, au lieu de comparer la chaîne de recherche à la chaîne de l’index.

Considérations de sécurité

La méthode CompareInfo.GetSortKey(String, CompareOptions) retourne un objet SortKey avec la valeur basée sur une chaîne et une valeur CompareOptions spécifiées, et la culture associée à l’objet CompareInfo sous-jacent. Si une décision de sécurité dépend d’une comparaison de chaînes ou d’un changement de casse, vous devez utiliser la méthode CompareInfo.GetSortKey(String, CompareOptions) de la culture invariante pour que le comportement de l’opération soit cohérent, quels que soient les paramètres de culture du système d’exploitation.

Pour obtenir une clé de tri, procédez comme suit :

  1. Récupérez la culture invariante auprès de la propriété CultureInfo.InvariantCulture.

  2. Récupérez un objet CompareInfo pour la culture invariante auprès de la propriété CultureInfo.CompareInfo.

  3. Appelez la méthode CompareInfo.GetSortKey(String, CompareOptions) .

Utiliser la valeur d’un objet SortKey équivaut à appeler la méthode Windows LCMapString en spécifiant la valeur LCMAP_SORTKEY. Cependant, pour l’objet SortKey, les clés de tri pour les caractères anglais précèdent les clés de tri pour les caractères coréens.

Les objets SortKey peuvent être sérialisés, mais seulement pour qu’ils puissent être croisés avec des objets AppDomain. Si une application sérialise un SortKey objet, l’application doit régénérer toutes les clés de tri lorsqu’il existe une nouvelle version de .NET.

Pour plus d’informations sur les clés de tri, consultez Standard technique Unicode #10, « Algorithme de classement Unicode » sur le site web du Consortium Unicode.