SortKey SortKey SortKey SortKey Class

Определение

Представляет результат сопоставления строки ее ключу сортировки.Represents the result of mapping a string to its sort key.

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

Примеры

В следующем примере сравнивается строка "ллама" с использованием языков и региональных параметров "en-US" и "es-ES", а также "en-US" и "es-ES" традиционного языка и региональных параметров.The following example compares the string "llama" using the "en-US" and "es-ES" cultures, and the "en-US" and "es-ES" traditional cultures.

using namespace System;
using namespace System::Globalization;
int main()
{
   
   // Creates a SortKey using the en-US culture.
   CultureInfo^ MyCI = gcnew CultureInfo( "en-US",false );
   CompareInfo^ myComp_enUS = MyCI->CompareInfo;
   SortKey^ mySK1 = myComp_enUS->GetSortKey( "llama" );
   
   // Creates a SortKey using the es-ES culture with international sort.
   MyCI = gcnew CultureInfo( "es-ES",false );
   CompareInfo^ myComp_esES = MyCI->CompareInfo;
   SortKey^ mySK2 = myComp_esES->GetSortKey( "llama" );
   
   // Creates a SortKey using the es-ES culture with traditional sort.
   MyCI = gcnew CultureInfo( 0x040A,false );
   CompareInfo^ myComp_es = MyCI->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 S"llama" in en-US and in es-ES with international sort : 0
Comparing S"llama" in en-US and in es-ES with traditional sort   : -1
*/
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 'Main 

End Class 'SamplesSortKey


'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 класс для повышения производительности приложения, которое сильно зависит от сортировки и поиска в большом массиве.The following example shows how you can use the SortKey class to improve performance in an application that relies extensively on sorting and searching a large array. В этом примере создается неупорядоченный массив имен, который в данном случае содержит 13 элементов.The example creates an unordered array of names, which in this case has 13 elements. Затем он сохраняет ключ сортировки каждого имени в параллельном массиве, который передается Array.Sort(Array, Array) в метод.It then stores the sort key of each name in a parallel array, which it passes to the Array.Sort(Array, Array) method. Результатом является отсортированный массив.The result is a sorted array. Затем в этом примере выполняется поиск трех строк в массиве.The example then searches the array for three strings. Для каждой строки поиска вызывается CompareInfo.GetSortKey(String, CompareOptions) метод для получения ключа сортировки строки, а затем Array.FindIndex вызывается метод для получения индекса этого ключа сортировки в массиве ключей сортировки.For each search string, it calls the CompareInfo.GetSortKey(String, CompareOptions) method to retrieve the string's sort key, and then calls the Array.FindIndex method to retrieve the index of that sort key in the array of sort keys. Поскольку массивы ключей Name и Sort являются параллельными, возвращаемый индекс также является индексом имени в names массиве.Because the name and sort key arrays are parallel, the returned index is also the index of the name in the names array.

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

Комментарии

Сравнение двух строк с учетом языка и региональных параметров зависит от каждого символа в строках, имеющих несколько категорий весовых коэффициентов сортировки, включая скрипты, буквы алфавита, регистры и диакритические знаки.A culture-sensitive comparison of two strings depends on each character in the strings having several categories of sort weights, including script, alphabetic, case, and diacritic weights. Ключ сортировки служит репозиторием этих весов для определенной строки.A sort key serves as the repository of these weights for a particular string.

Метод возвращает экземпляр SortKey класса, отражающий сопоставление символов в указанной строке с учетом языка и региональных параметров. CompareInfo.GetSortKeyThe CompareInfo.GetSortKey method returns an instance of the SortKey class that reflects the culture-sensitive mapping of characters in a specified string. Значение SortKey объекта представляет собой его ключевые данные, возвращаемые KeyData свойством.The value of a SortKey object is its key data, which is returned by the KeyData property. Эти данные ключа состоят из последовательности байтов, которая кодирует строку, правила сортировки, зависящие от языка и региональных параметров, и параметры сравнения, заданные пользователем.This key data consists of a series of bytes that encode the string, culture-specific sorting rules, and user-specified comparison options. Сравнение с помощью ключей сортировки состоит из побитового сравнения соответствующих ключевых данных в каждом ключе сортировки.A comparison using sort keys consists of a bitwise comparison of the corresponding key data in each sort key. Например, если создать ключ сортировки, вызвав GetSortKey(String, CompareOptions) метод со CompareOptions.IgnoreCaseзначением, операция сравнения строк, использующая ключ сортировки, не учитывает регистр.For example, if you create a sort key by calling the GetSortKey(String, CompareOptions) method with a value of CompareOptions.IgnoreCase, a string comparison operation that uses the sort key is case-insensitive.

После создания ключа сортировки для строки Сравните ключи сортировки, вызвав статический SortKey.Compare метод.After you create a sort key for a string, you compare sort keys by calling the static SortKey.Compare method. Этот метод выполняет простое побайтовое сравнение, поэтому оно выполняется гораздо быстрее, чем String.Compare метод или. CompareInfo.CompareThis method performs a simple byte-by-byte comparison, so it is much faster than the String.Compare or CompareInfo.Compare method.

Примечание

Можно скачать таблицы весовых коэффициентов сортировки, набор текстовых файлов, содержащих сведения о весах символов, используемых в операциях сортировки и сравнения для операционных систем Windows, таблицу элементов параметров сортировки Юникода по умолчанию, сортировку Таблица веса для Linux и macOS.You can download the Sorting Weight Tables, a set of text files that contain information on the character weights used in sorting and comparison operations for Windows operating systems, the Default Unicode Collation Element Table, the sort weight table for Linux and macOS.

Особенности производительностиPerformance considerations

При сравнении Compare строк методы и CompareInfo.Compare выдают одинаковые результаты, но они предназначены для различных сценариев.When performing a string comparison, the Compare and CompareInfo.Compare methods yield the same results, but they target different scenarios.

На высоком уровне CompareInfo.Compare метод создает ключ сортировки для каждой строки, выполняет сравнение, а затем удаляет ключ сортировки и возвращает результат сравнения.At a high level, the CompareInfo.Compare method generates the sort key for each string, performs the comparison, and then discards the sort key and returns the result of the comparison. CompareInfo.Compare Однако метод фактически не создает ключ сортировки для выполнения сравнения.However, the CompareInfo.Compare method actually doesn't generate an entire sort key to perform the comparison. Вместо этого метод создает ключевые данные для каждого текстового элемента (то есть базового символа, суррогатной пары или сочетания последовательности символов) в каждой строке.Instead, the method generates the key data for each text element (that is, base character, surrogate pair, or combining character sequence) in each string. Затем метод сравнивает данные ключа для соответствующих текстовых элементов.The method then compares the key data for the corresponding text elements. Операция завершается сразу после определения конечного результата сравнения.The operation terminates as soon as the ultimate result of the comparison is determined. Сведения о ключе сортировки вычислены, SortKey но объект не создается.Sort key information is computed, but no SortKey object is created. Эта стратегия экономична в плане производительности, если обе строки сравниваются один раз, но становятся дорогостоящими, если одни и те же строки сравниваются несколько раз.This strategy is economical in terms of performance if both strings are compared once, but becomes expensive if the same strings are compared many times.

Перед выполнением сравнения SortKey методтребуетсозданияобъектадлякаждойстроки.CompareThe Compare method requires generation of a SortKey object for each string before performing the comparison. Эта стратегия является дорогостоящей с точки зрения производительности при первом сравнении из-за времени и памяти, инвестированной для SortKey создания объектов.This strategy is expensive in terms of performance for the first comparison because of the time and memory invested to generate the SortKey objects. Однако он считается экономичным, если несколько раз сравниваются одни и те же ключи сортировки.However, it becomes economical if the same sort keys are compared many times.

Например, предположим, что вы написали приложение, которое ищет в таблице базы данных строку, в которой строковый столбец индекса совпадает с указанной строкой поиска.For example, suppose you write an application that searches a database table for the row in which the string-based index column matches a specified search string. Таблица содержит тысячи строк, и сравнение строки поиска с индексом в каждой строке займет много времени.The table contains thousands of rows, and comparing the search string to the index in each row will take a long time. Таким образом, когда приложение сохраняет строку и столбец индекса, она также создает и сохраняет ключ сортировки для индекса в столбце, выделенном для повышения производительности поиска.Therefore, when the application stores a row and its index column, it also generates and stores the sort key for the index in a column dedicated to improving search performance. Когда приложение выполняет поиск целевой строки, оно сравнивает ключ сортировки строки поиска с ключом сортировки для строки индекса вместо того, чтобы сравнивать строку поиска со строкой индекса.When the application searches for a target row, it compares the sort key for the search string to the sort key for the index string, instead of comparing the search string to the index string.

Замечания по безопасностиSecurity considerations

Метод возвращает объект со значением на основе указанной строки и CompareOptions значения, а также язык и региональные параметры, связанные с базовым CompareInfo объектом. SortKey CompareInfo.GetSortKey(String, CompareOptions)The CompareInfo.GetSortKey(String, CompareOptions) method returns a SortKey object with the value based on a specified string and CompareOptions value, and the culture associated with the underlying CompareInfo object. Если решение о безопасности зависит от сравнения строк или изменения регистра, следует использовать CompareInfo.GetSortKey(String, CompareOptions) метод инвариантного языка и региональных параметров, чтобы обеспечить целостность поведения операции, независимо от настроек языка и региональных параметров операционной системы.If a security decision depends on a string comparison or case change, you should use the CompareInfo.GetSortKey(String, CompareOptions) method of the invariant culture to ensure that the behavior of the operation is consistent, regardless of the culture settings of the operating system.

Чтобы получить ключ сортировки, выполните следующие действия.Use the following steps to obtain a sort key:

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

  2. Получите объект для инвариантного языка и региональных параметров CultureInfo.CompareInfo из свойства. CompareInfoRetrieve a CompareInfo object for the invariant culture from the CultureInfo.CompareInfo property.

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

Работа со значением SortKey объекта эквивалентно вызову метода Windows LCMapString с указанным значением LCMAP_SORTKEY.Working with the value of a SortKey object is equivalent to calling the Windows LCMapString method with the LCMAP_SORTKEY value specified. Однако для SortKey объекта ключи сортировки для английских символов предшествуют ключам сортировки для корейских символов.However, for the SortKey object, the sort keys for English characters precede the sort keys for Korean characters.

SortKeyобъекты можно сериализовать, но только для того, чтобы они могли пересекать AppDomain объекты.SortKey objects can be serialized, but only so that they can cross AppDomain objects. Если приложение сериализует SortKey объект, приложение должно повторно создать все ключи сортировки при наличии новой версии .NET Framework.If an application serializes a SortKey object, the application must regenerate all the sort keys when there is a new version of the .NET Framework.

Дополнительные сведения о ключах сортировки см. в статье технические стандарты Юникода #10, "алгоритм параметров сортировки Юникода" на веб-сайте консорциума Unicode.For more information about sort keys, see Unicode Technical Standard #10, "Unicode Collation Algorithm" on the Unicode Consortium website.

Свойства

KeyData KeyData KeyData KeyData

Возвращает массив байтов, представляющий текущий объект SortKey.Gets the byte array representing the current SortKey object.

OriginalString OriginalString OriginalString OriginalString

Возвращает исходную строку, используемую для создания текущего объекта SortKey.Gets the original string used to create the current SortKey object.

Методы

Compare(SortKey, SortKey) Compare(SortKey, SortKey) Compare(SortKey, SortKey) Compare(SortKey, SortKey)

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

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Определяет, равен ли заданный объект текущему объекту SortKey.Determines whether the specified object is equal to the current SortKey object.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Служит хэш-функцией текущего объекта SortKey для использования в алгоритмах и структурах данных хеширования, например в хэш-таблице.Serves as a hash function for the current SortKey object that is suitable for hashing algorithms and data structures such as a hash table.

GetType() GetType() GetType() GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Возвращает строку, представляющую текущий объект SortKey.Returns a string that represents the current SortKey object.

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

Дополнительно