Класс SortKey

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Сравнение двух строк с учетом языка и региональных параметров зависит от каждого символа в строках с несколькими категориями весов сортировки, включая скрипт, алфавит, регистр и диакритические весы. Ключ сортировки служит репозиторием этих весов для определенной строки.

Метод CompareInfo.GetSortKey возвращает экземпляр SortKey класса, который отражает сопоставление символов с учетом языка и региональных параметров в указанной строке. Значение SortKey объекта — это его ключевые данные, возвращаемые свойством KeyData . Эти ключевые данные состоят из ряда байтов, которые кодируют строки, правила сортировки, зависящие от языка и региональных параметров, и параметры сравнения, заданные пользователем. Сравнение с использованием ключей сортировки состоит из побитового сравнения соответствующих ключевых данных в каждом ключе сортировки. Например, если вы создаете ключ сортировки путем вызова GetSortKey(String, CompareOptions) метода со значением CompareOptions.IgnoreCase, операция сравнения строк, использующая ключ сортировки, не учитывает регистр.

После создания ключа сортировки для строки вы сравниваете ключи сортировки путем вызова статического SortKey.Compare метода. Этот метод выполняет простое сравнение байтов по байтам, поэтому это гораздо быстрее, чем String.Compare метод или CompareInfo.Compare метод.

Примечание.

Вы можете скачать таблицы веса сортировки, набор текстовых файлов, содержащих сведения о весах символов, используемых в операциях сортировки и сравнения для операционных систем Windows, таблице элементов сортировки Юникода по умолчанию, таблице веса сортировки для Linux и macOS.

Замечания, связанные с быстродействием

При сравнении CompareCompareInfo.Compare строк методы дают одинаковые результаты, но они предназначены для разных сценариев.

На высоком уровне CompareInfo.Compare метод создает ключ сортировки для каждой строки, выполняет сравнение, а затем от карта ключает ключ сортировки и возвращает результат сравнения. Однако метод CompareInfo.Compare фактически не создает весь ключ сортировки для сравнения. Вместо этого метод создает ключевые данные для каждого текстового элемента (то есть базового символа, суррогатной пары или объединения последовательности символов) в каждой строке. Затем метод сравнивает ключевые данные для соответствующих текстовых элементов. Операция завершается сразу после определения конечного результата сравнения. Сведения о сортировке ключей вычисляются, но объект не SortKey создается. Эта стратегия экономична с точки зрения производительности, если обе строки сравниваются один раз, но становится дорогостоящим, если одни и те же строки сравниваются несколько раз.

Метод Compare требует создания объекта для каждой SortKey строки перед выполнением сравнения. Эта стратегия дорого с точки зрения производительности для первого сравнения из-за времени и памяти, вложенной в создание SortKey объектов. Тем не менее, он становится экономичным, если одни и те же ключи сортировки сравниваются много раз.

Например, предположим, что вы напишете приложение, которое выполняет поиск в таблице базы данных для строки, в которой столбец индекса на основе строк соответствует указанной строке поиска. Таблица содержит тысячи строк, а сравнение строки поиска с индексом в каждой строке займет много времени. Таким образом, если приложение хранит строку и его столбец индекса, он также создает и сохраняет ключ сортировки для индекса в столбце, выделенном для повышения производительности поиска. При поиске целевой строки приложение сравнивает ключ сортировки для строки поиска с ключом сортировки для строки индекса вместо сравнения строки поиска со строкой индекса.

Вопросы безопасности

Метод CompareInfo.GetSortKey(String, CompareOptions) возвращает SortKey объект со значением на основе указанной строки и CompareOptions значения, а также языка и региональных параметров, связанных с базовым CompareInfo объектом. Если решение о безопасности зависит от сравнения строк или изменения регистра, следует использовать CompareInfo.GetSortKey(String, CompareOptions) метод инвариантного языка и региональных параметров, чтобы обеспечить согласованность поведения операции независимо от параметров языка и региональных параметров операционной системы.

Чтобы получить ключ сортировки, выполните следующие действия.

  1. Извлеките инвариантный язык и региональные CultureInfo.InvariantCulture параметры из свойства.

  2. CompareInfo Извлеките объект для инвариантного языка и региональных параметров из CultureInfo.CompareInfo свойства.

  3. Вызовите метод CompareInfo.GetSortKey(String, CompareOptions) .

Работа со значением SortKey объекта эквивалентна вызову метода Windows LCMapString с указанным значением LCMAP_SORTKEY. Однако для SortKey объекта ключи сортировки для английских символов предшествуют ключам сортировки для корейских символов.

SortKey Объекты можно сериализовать, но только так, чтобы они могли пересекать AppDomain объекты. Если приложение сериализует SortKey объект, приложение должно повторно создать все ключи сортировки при наличии новой версии .NET.

Дополнительные сведения о ключах сортировки см. в разделе Юникод Technical Standard #10, "Алгоритм сортировки Юникода" на веб-сайте консорциума Юникода.