この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
2 つの文字列のカルチャに依存する比較は、スクリプト、アルファベット、大文字と小文字、分音記号の重みなど、複数の種類の重みを持つ文字列内の各文字によって異なります。 並べ替えキーは、特定の文字列に対するこれらの重みのリポジトリとして機能します。
CompareInfo.GetSortKey メソッドは、指定した文字列内の文字のカルチャに依存するマッピングを反映するSortKey クラスのインスタンスを返します。 SortKey オブジェクトの値は、KeyData プロパティによって返されるキー データです。 このキー データは、文字列をエンコードする一連のバイト、カルチャ固有の並べ替え規則、およびユーザー指定の比較オプションで構成されます。 並べ替えキーを使用した比較は、各並べ替えキーの対応するキー データのビットごとの比較で構成されます。 たとえば、CompareOptions.IgnoreCaseの値を使用してGetSortKey(String, CompareOptions) メソッドを呼び出して並べ替えキーを作成する場合、並べ替えキーを使用する文字列比較操作では大文字と小文字が区別されません。
文字列の並べ替えキーを作成した後、静的 SortKey.Compare メソッドを呼び出して並べ替えキーを比較します。 このメソッドは、単純なバイト単位の比較を実行するため、 String.Compare または CompareInfo.Compare メソッドよりもはるかに高速です。
注
重みテーブルの並べ替え、Windows オペレーティング システムの並べ替えおよび比較操作で使用される文字の重み、既定の Unicode 照合順序要素テーブル、Linux および macOS の並べ替え重みテーブルに関する情報を含むテキスト ファイルのセットをダウンロードできます。
パフォーマンスに関する考慮事項
文字列比較を実行すると、 Compare メソッドと CompareInfo.Compare メソッドは同じ結果を得られますが、異なるシナリオを対象とします。
大まかに言うと、 CompareInfo.Compare メソッドは、各文字列の並べ替えキーを生成し、比較を実行した後、並べ替えキーを破棄して比較の結果を返します。 ただし、 CompareInfo.Compare メソッドでは、比較を実行するための並べ替えキー全体が実際には生成されません。 代わりに、メソッドは各文字列内の各テキスト要素 (つまり、基本文字、サロゲート ペア、または結合文字シーケンス) のキー データを生成します。 次に、このメソッドは、対応するテキスト要素のキー データを比較します。 この操作は、比較の最終的な結果が決定されるとすぐに終了します。 並べ替えキー情報は計算されますが、 SortKey オブジェクトは作成されません。 この方法は、両方の文字列を 1 回比較するとパフォーマンスの面で経済的ですが、同じ文字列を何度も比較するとコストがかかります。
Compareメソッドでは、比較を実行する前に、文字列ごとにSortKey オブジェクトを生成する必要があります。 この戦略は、 SortKey オブジェクトの生成に費やされた時間とメモリが原因で、最初の比較のパフォーマンスの面でコストがかかります。 ただし、同じ並べ替えキーを何度も比較すると、経済的になります。
たとえば、文字列ベースのインデックス列が指定した検索文字列と一致する行をデータベース テーブルで検索するアプリケーションを作成するとします。 テーブルには何千もの行が含まれており、各行のインデックスと検索文字列を比較するには時間がかかります。 そのため、アプリケーションが行とそのインデックス列を格納すると、検索パフォーマンスの向上専用の列にインデックスの並べ替えキーも生成および格納されます。 アプリケーションは、ターゲット行を検索するときに、検索文字列とインデックス文字列を比較するのではなく、検索文字列の並べ替えキーとインデックス文字列の並べ替えキーを比較します。
セキュリティに関する考慮事項
CompareInfo.GetSortKey(String, CompareOptions) メソッドは、指定した文字列とCompareOptions値に基づく値と、基になるCompareInfo オブジェクトに関連付けられたカルチャを持つSortKey オブジェクトを返します。 セキュリティ上の決定が文字列比較または大文字と小文字の変更に依存する場合は、インバリアント カルチャの CompareInfo.GetSortKey(String, CompareOptions) メソッドを使用して、オペレーティング システムのカルチャ設定に関係なく、操作の動作が一貫していることを確認する必要があります。
並べ替えキーを取得するには、次の手順に従います。
CultureInfo.InvariantCulture プロパティからインバリアント カルチャを取得します。
CultureInfo.CompareInfo プロパティからインバリアント カルチャのCompareInfo オブジェクトを取得します。
CompareInfo.GetSortKey(String, CompareOptions) メソッドを呼び出します。
SortKey オブジェクトの値の操作は、LCMAP_SORTKEY値を指定して Windows LCMapString
メソッドを呼び出すことと同じです。 ただし、 SortKey オブジェクトの場合、英語文字の並べ替えキーは韓国語文字の並べ替えキーの前にあります。
SortKey オブジェクトはシリアル化できますが、 AppDomain オブジェクト間でのみ使用できます。 アプリケーションが SortKey オブジェクトをシリアル化する場合、新しいバージョンの .NET がある場合、アプリケーションはすべての並べ替えキーを再生成する必要があります。
並べ替えキーの詳細については、Unicode コンソーシアム Web サイトの Unicode Technical Standard #10 の「Unicode 照合順序アルゴリズム」を参照してください。
.NET