SortKey クラス

この記事は、この API のリファレンス ドキュメントの補足説明です。

2 つの文字列のカルチャで区別される比較は、書体、アルファベット、大文字と小文字の区別、発音記号のウェイトなど、並べ替えのウェイトに複数のカテゴリがある文字列内の各文字によって変わります。 並べ替えキーは、特定の文字列に対するこれらのウェイトを格納するリポジトリとして機能します。

CompareInfo.GetSortKey メソッドは、指定された文字列内の文字のカルチャで区別されるマッピングを反映する SortKey クラスのインスタンスを返します。 SortKey オブジェクトの値はそのキー データです。これは KeyData プロパティから返されます。 このキー データは、文字列、カルチャ固有の並べ替え規則、ユーザー指定の比較オプションをエンコードする一連のバイトで構成されます。 並べ替えキーを使った比較は、各並べ替えキー内の対応するキー データのビットごとの比較で構成されます。 たとえば、GetSortKey(String, CompareOptions) メソッドを呼び出す際に値 CompareOptions.IgnoreCase を指定して並べ替えキーを作成した場合、並べ替えキーを使う文字列比較操作では大文字と小文字が区別されません。

文字列の並べ替えキーを作成したら、静的 SortKey.Compare メソッドを呼び出して並べ替えキーを比較します。 このメソッドは単純なバイトごとの比較を実行するため、String.Compare または CompareInfo.Compare メソッドよりもはるかに高速です。

Note

並べ替えウェイト テーブル (Windows オペレーティング システムの並べ替えと比較の操作で使われる文字のウェイトに関する情報が含まれています) と、既定の Unicode 照合順序要素テーブル (Linux と macOS 用の並べ替えウェイト テーブル) をダウンロードできます。

パフォーマンスに関する考慮事項

文字列比較を実行すると、Compare メソッドと CompareInfo.Compare メソッドは同じ結果を返しますが、対象とするシナリオは異なります。

大まかに言うと、CompareInfo.Compare メソッドは、各文字列の並べ替えキーを生成し、比較を実行した後、並べ替えキーを破棄して比較の結果を返します。 ただし、実際には、CompareInfo.Compare メソッドは比較を実行するための並べ替えキー全体を生成しません。 そうではなく、このメソッドは各文字列内の各テキスト要素 (つまり、基本文字、サロゲート ペア、または結合文字シーケンス) のキー データを生成します。 次に、このメソッドは、対応するテキスト要素のキー データを比較します。 この操作は、比較の最終結果が決まるとすぐに終了します。 並べ替えキー情報は計算されますが、SortKey オブジェクトは作成されません。 この戦略は、両方の文字列を 1 回比較する場合にはパフォーマンスの点で経済的ですが、同じ文字列を何度も比較するとコストが高くなります。

Compare メソッドの場合、比較を実行する前に文字列ごとに SortKey オブジェクトを生成する必要があります。 この戦略は、SortKey オブジェクトの生成に時間とメモリが費やされるため、最初の比較についてはパフォーマンスの点でコストが高くなります。 ただし、同じ並べ替えキーを何度も比較する場合は経済的です。

たとえば、文字列ベースのインデックス列が指定された検索文字列と一致する行をデータベース テーブルで検索するアプリケーションを作成するとします。 テーブルには何千もの行が含まれており、検索文字列と各行のインデックスを比較するには時間がかかります。 そのため、アプリケーションで行とそのインデックス列を格納するときに、検索パフォーマンスの向上を目的とした専用の列にインデックスの並べ替えキーも生成して格納します。 アプリケーションでターゲット行を検索するときに、検索文字列とインデックス文字列を比較するのではなく、検索文字列の並べ替えキーとインデックス文字列の並べ替えキーを比較します。

セキュリティに関する考慮事項

CompareInfo.GetSortKey(String, CompareOptions) メソッドは、指定された文字列と CompareOptions 値に基づく値を持つ SortKey オブジェクトと、基になる CompareInfo オブジェクトに関連付けられたカルチャを返します。 文字列比較または大文字と小文字の区別が変わった場合にセキュリティの決定も変わる場合は、インバリアント カルチャの CompareInfo.GetSortKey(String, CompareOptions) メソッドを使って、オペレーティング システムのカルチャ設定に関係なく、一貫した操作の動作になるように確保する必要があります。

次の手順で並べ替えキーを取得します。

  1. CultureInfo.InvariantCulture プロパティからインバリアント カルチャを取得します。

  2. CultureInfo.CompareInfo プロパティからインバリアント カルチャの CompareInfo オブジェクトを取得します。

  3. CompareInfo.GetSortKey(String, CompareOptions) メソッドを呼び出します。

SortKey オブジェクトの値を操作することは、LCMAP_SORTKEY 値を指定して Windows LCMapString メソッドを呼び出すことと同じです。 ただし、SortKey オブジェクトの場合、英語文字の並べ替えキーは韓国語文字の並べ替えキーよりも前にあります。

SortKey オブジェクトはシリアル化できますが、それは AppDomain オブジェクトをクロス処理できる場合に限られます。 アプリケーションがオブジェクトを SortKey シリアル化する場合、新しいバージョンの .NET がある場合、アプリケーションはすべての並べ替えキーを再生成する必要があります。

並べ替えキーの詳細については、Unicode Consortium Web サイトの「Unicode Technical Standard #10」(Unicode 技術標準 #10) の「Unicode Collation Algorithm」(Unicode 照合順序アルゴリズム) を参照してください。