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" カルチャを使用した文字列 "llama" と、"en-us" と "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

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クラスを使用して、大規模な配列の並べ替えと検索に大きく依存するアプリケーションのパフォーマンスを向上させる方法を示しています。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. この例では、配列内で3つの文字列を検索します。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. 名前と並べ替えキーの配列は並列であるため、返されるインデックスは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

注釈

2つの文字列のカルチャに依存した比較では、スクリプト、アルファベット、大文字と小文字、および発音区別度を含む、いくつかのカテゴリの並べ替えの重みを持つ文字列の各文字に依存します。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.

メソッドCompareInfo.GetSortKeyは、指定されたSortKey文字列内の文字のカルチャに依存したマッピングを反映するクラスのインスタンスを返します。The 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.Compareメソッドよりもはるかに高速です。This method performs a simple byte-by-byte comparison, so it is much faster than the String.Compare or CompareInfo.Compare method.

注意

並べ替えの重みテーブルをダウンロードできます。これには、Windows オペレーティングシステムの並べ替えおよび比較操作で使用される文字の重みに関する情報を含むテキストファイルのセット、既定の Unicode 照合順序要素テーブル、並べ替え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. この方法は、両方の文字列が1回比較される場合のパフォーマンスの点で経済的ですが、同じ文字列が何度も比較される場合はコストが高くなります。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.

メソッドCompareでは、比較をSortKey実行する前に、文字列ごとにオブジェクトを生成する必要があります。The 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

メソッドCompareInfo.GetSortKey(String, CompareOptions)は、指定SortKeyされた文字列とCompareOptions値、および基になるCompareInfoオブジェクトに関連付けられているカルチャに基づいて、値を持つオブジェクトを返します。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. インバリアントCompareInfoカルチャのオブジェクトをCultureInfo.CompareInfoプロパティから取得します。Retrieve 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オブジェクトの値を使用することは、指定されたLCMapString LCMAP_SORTKEY 値を使用して Windows メソッドを呼び出すことと同じです。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.

並べ替えキーの詳細については、「unicode Technical Standard #10」、unicodeコンソーシアムの web サイトの「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)

2 つの並べ替えキーを比較します。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.

適用対象

こちらもご覧ください