SortKey Класс

Определение

Представляет результат сопоставления строки с ключом сортировки.

public ref class SortKey sealed
public ref class SortKey
public sealed class SortKey
public class SortKey
[System.Serializable]
public class SortKey
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class SortKey
type SortKey = class
[<System.Serializable>]
type SortKey = class
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type SortKey = class
Public NotInheritable Class SortKey
Public Class SortKey
Наследование
SortKey
Атрибуты

Примеры

В следующем примере сравнивается строка "llama" с помощью языка "en-US" и "es-ES" и "es-ES" и "en-USes-ES" традиционных культур.

using System;
using System.Globalization;

public class SamplesSortKey  {

   public static void Main()  {

      // Creates a SortKey using the en-US culture.
      CompareInfo myComp_enUS = new CultureInfo("en-US",false).CompareInfo;
      SortKey mySK1 = myComp_enUS.GetSortKey( "llama" );

      // Creates a SortKey using the es-ES culture with international sort.
      CompareInfo myComp_esES = new CultureInfo("es-ES",false).CompareInfo;
      SortKey mySK2 = myComp_esES.GetSortKey( "llama" );

      // Creates a SortKey using the es-ES culture with traditional sort.
      CompareInfo myComp_es   = new CultureInfo(0x040A,false).CompareInfo;
      SortKey mySK3 = myComp_es.GetSortKey( "llama" );

      // Compares the en-US SortKey with each of the es-ES SortKey objects.
      Console.WriteLine( "Comparing \"llama\" in en-US and in es-ES with international sort : {0}", SortKey.Compare( mySK1, mySK2 ) );
      Console.WriteLine( "Comparing \"llama\" in en-US and in es-ES with traditional sort   : {0}", SortKey.Compare( mySK1, mySK3 ) );
   }
}

/*
This code produces the following output.

Comparing "llama" in en-US and in es-ES with international sort : 0
Comparing "llama" in en-US and in es-ES with traditional sort   : -1
*/
Imports System.Globalization

Public Class SamplesSortKey

   Public Shared Sub Main()

      ' Creates a SortKey using the en-US culture.
      Dim myComp_enUS As CompareInfo = New CultureInfo("en-US", False).CompareInfo
      Dim mySK1 As SortKey = myComp_enUS.GetSortKey("llama")

      ' Creates a SortKey using the es-ES culture with international sort.
      Dim myComp_esES As CompareInfo = New CultureInfo("es-ES", False).CompareInfo
      Dim mySK2 As SortKey = myComp_esES.GetSortKey("llama")

      ' Creates a SortKey using the es-ES culture with traditional sort.
      Dim myComp_es As CompareInfo = New CultureInfo(&H40A, False).CompareInfo
      Dim mySK3 As SortKey = myComp_es.GetSortKey("llama")

      ' Compares the en-US SortKey with each of the es-ES SortKey objects.
      Console.WriteLine("Comparing ""llama"" in en-US and in es-ES with international sort : {0}", SortKey.Compare(mySK1, mySK2))
      Console.WriteLine("Comparing ""llama"" in en-US and in es-ES with traditional sort   : {0}", SortKey.Compare(mySK1, mySK3))

   End Sub

End Class


'This code produces the following output.
'
'Comparing "llama" in en-US and in es-ES with international sort : 0
'Comparing "llama" in en-US and in es-ES with traditional sort   : -1

В следующем примере показано, как использовать SortKey класс для повышения производительности в приложении, которое используется для сортировки и поиска большого массива. В примере создается неупорядоченный массив имен, который в данном случае содержит 13 элементов. Затем он сохраняет ключ сортировки каждого имени в параллельном массиве, который он передает методу Sort(Array, Array) . Результатом является отсортированный массив. Затем в примере выполняется поиск массива для трех строк. Для каждой строки поиска метод вызывает GetSortKey(String, CompareOptions) метод для получения ключа сортировки строки, а затем вызывает Array.FindIndex метод, чтобы получить индекс этого ключа сортировки в массиве ключей сортировки. Так как массивы имен и ключей сортировки параллельны, возвращаемый индекс также является индексом имени в массиве names .

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      // Define names.
      String[] names= { "Adam", "Ignatius", "Batholomew", "Gregory",
                        "Clement", "Frances", "Harold", "Dalmatius",
                        "Edgar", "John", "Benedict", "Paul", "George" };
      SortKey[] sortKeys = new SortKey[names.Length];
      CompareInfo ci = CultureInfo.CurrentCulture.CompareInfo;

      for (int ctr = 0; ctr < names.Length; ctr++)
         sortKeys[ctr] = ci.GetSortKey(names[ctr], CompareOptions.IgnoreCase);

      // Sort array based on value of sort keys.
      Array.Sort(names, sortKeys);

      Console.WriteLine("Sorted array: ");
      foreach (var name in names)
         Console.WriteLine(name);

      Console.WriteLine();

      String[] namesToFind = { "Paul", "PAUL", "Wilberforce" };

      Console.WriteLine("Searching an array:");
      foreach (var nameToFind in namesToFind) {
         SortKey searchKey = ci.GetSortKey(nameToFind, CompareOptions.IgnoreCase);
         int index = Array.FindIndex(sortKeys, (x) => x.Equals(searchKey));
         if (index >= 0)
            Console.WriteLine("{0} found at index {1}: {2}", nameToFind,
                              index, names[index]);
         else
            Console.WriteLine("{0} not found", nameToFind);
      }
   }
}
// The example displays the following output:
//       Sorted array:
//       Adam
//       Batholomew
//       Benedict
//       Clement
//       Dalmatius
//       Edgar
//       Frances
//       George
//       Gregory
//       Harold
//       Ignatius
//       John
//       Paul
//
//       Searching an array:
//       Paul found at index 12: Paul
//       PAUL found at index 12: Paul
//       Wilberforce not found
Imports System.Globalization

Module Example
   Public Sub Main()
      ' Define names.
      Dim names() As String = { "Adam", "Ignatius", "Batholomew", 
                                "Gregory", "Clement", "Frances",  
                                "Harold", "Dalmatius", "Edgar",    
                                "John", "Benedict", "Paul", "George" } 
      Dim sortKeys(names.Length - 1) As SortKey
      Dim ci As CompareInfo = CultureInfo.CurrentCulture.CompareInfo

      For ctr As Integer = 0 To names.Length - 1
         sortKeys(ctr) = ci.GetSortKey(names(ctr), CompareOptions.IgnoreCase)         
      Next   
      
      ' Sort array based on value of sort keys.
      Array.Sort(names, sortKeys)
      
      Console.WriteLine("Sorted array: ")
      For Each name In names
         Console.WriteLine(name)
      Next          
      Console.WriteLine()
      
      Dim namesToFind() As String = { "Paul", "PAUL", "Wilberforce" }
      
      Console.WriteLine("Searching an array:")
      For Each nameToFind In namesToFind
         Dim searchKey As SortKey = ci.GetSortKey(nameToFind, CompareOptions.IgnoreCase)
         Dim index As Integer = Array.FindIndex(sortKeys, 
                                                Function(x) x.Equals(searchKey)) 
         If index >= 0 Then
            Console.WriteLine("{0} found at index {1}: {2}", nameToFind,
                              index, names(index))
         Else
            Console.WriteLine("{0} not found", nameToFind)
         End If                     
      Next                     
   End Sub
End Module
' The example displays the following output:
'       Sorted array:
'       Adam
'       Batholomew
'       Benedict
'       Clement
'       Dalmatius
'       Edgar
'       Frances
'       George
'       Gregory
'       Harold
'       Ignatius
'       John
'       Paul
'       
'       Searching an array:
'       Paul found at index 12: Paul
'       PAUL found at index 12: Paul
'       Wilberforce not found

Комментарии

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

Метод 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.

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

Свойства

Имя Описание
KeyData

Возвращает массив байтов, представляющий текущий SortKey объект.

OriginalString

Возвращает исходную строку, используемую для создания текущего SortKey объекта.

Методы

Имя Описание
Compare(SortKey, SortKey)

Сравнивает два ключа сортировки.

Equals(Object)

Определяет, равен ли указанный объект текущему SortKey объекту.

GetHashCode()

Служит хэш-функцией для текущего SortKey объекта, который подходит для хэширования алгоритмов и структур данных, таких как хэш-таблица.

GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий SortKey объект.

Применяется к

См. также раздел