ここではString.EqualsメソッドやString.CompareToメソッドで指定することが出来る文字列比較のオプションと、その動作について詳しく見ていきます。 文字列比較のオプションを指定することで、大文字と小文字、全角と半角などといった違いをどう扱うか指定することが出来ます。
なお、このページで解説する比較操作に関連するインターフェイスについてや、コレクションとソートについて、カルチャと文字列操作については以下のページで詳しく解説しているので必要に応じて参照してください。
この文章では一部で特殊記号を使っています。 ブラウザで使用しているフォントによっては正しく表示されない文字があるかもしれません。
この文章では実行環境のロケール設定によって動作や結果が変わる場合のあるトピックを扱っています。 特に言及のない限りはja-JP(日本語/日本)の環境で実行した場合について解説しています。
StringComparison列挙型とStringComparerクラス
String.CompareメソッドやString.Equalsメソッドなどをはじめとして、.NET Frameworkでは文字列比較の際に比較オプションを指定することでその動作を変更することができます。
一例として、大文字と小文字の違いを無視して2つの文字列が等しいかどうか比較したい場合は次のようにします。
上記の例ではStringComparison列挙型で文字列の比較オプションを指定しています。
また別の例として、大文字と小文字の違いを無視してキーを扱うDictionaryを作成したい場合は次のようにします。
上記の例ではStringComparerクラスを指定することでDictionaryのキー比較処理をカスタマイズしています。
このように、大文字小文字の無視の他にも特定カルチャに依存した(あるいは依存しない)並べ替え規則の適用など、目的に応じて比較オプションを選択することができます。
StringComparison列挙型
StringComparison列挙型は、文字列比較の際の動作を指定するための列挙型で、次のメソッドにおいて文字列比較を行う際にオプションとして指定出来ます。
- StringComparisonを引数に指定することができるメソッド
また、StringComparisonを指定する場合は、次のいずれかを指定できます。
StringComparisonの値 | 文字列比較時の動作 | |
---|---|---|
大文字小文字の違い | 比較の規則 | |
StringComparison.CurrentCulture | 無視しない | 現在のカルチャの並べ替え規則に基づいて比較する |
StringComparison.CurrentCultureIgnoreCase | 無視する | |
StringComparison.InvariantCulture | 無視しない | インバリアントカルチャの並べ替え規則に基づいて比較する |
StringComparison.InvariantCultureIgnoreCase | 無視する | |
StringComparison.Ordinal | 無視しない | 文字列の各文字を数値(Unicode序数、Unicode ordinal)=コードポイントで比較する |
StringComparison.OrdinalIgnoreCase | 無視する |
StringComparisonを指定しない場合は、StringComparison.CurrentCultureを指定した場合と同じ動作になります。
以下はStringComparisonを指定して比較を行う例です。
それぞれの違いについての具体的な解説は§.CurrentCultureとInvariantCultureの違い・§.CurrentCultureとOrdinalの違いにて、また使い分ける際の考え方については§.StringComparisonの使い分けで別途解説します。
全角と半角の違い・ひらがなとカタカナの違いを扱いたい場合はCompareOptions列挙型を使用することができます。
現在のカルチャとインバリアントカルチャなど、文字列比較に際してカルチャによって変わる動作・カルチャごとの文字列比較の規則についてはカルチャによる動作の違いとインバリアントカルチャ §.文字列比較の規則・ソート順定義(CompareInfo)としてのCurrentCultureを参照してください。 カルチャそのものに関してはカルチャの基本・種類・カルチャ情報の取得を参照してください。
CurrentCultureとInvariantCultureの違い
CurrentCulture
とInvariantCulture
は、ともに特定のカルチャでの規則に基づいた比較を行う点では同じですが、CurrentCulture
では現在のカルチャに基づいた比較を行うのに対し、InvariantCulture
では特定の文化圏や言語に依存しないインバリアントカルチャに基づいた比較を行う点が異なります。
以下はString.Compareメソッドの結果を用いてこれらの違いを見るためのサンプルです。
スレッドのカルチャをen-US(英語/米国)に変更する前後の結果に注目してください。 InvariantCulture
での結果はどちらも変わらないのに対し、CurrentCulture
での結果は、スレッドのカルチャを変更する前後で異なっています。
これは、ja-JP(日本語/日本)の規則では漢字の読みによる並びとなっているために亜(あ)の方が井(い)より小さい(前に並ぶ)、つまり"亜<井"とされるのに対し、en-US(英語/米国)の規則では文字のコードポイントによる並びとなっているために、井(U+4E95)の方が亜(U+4E9C)よりも小さい(前に並ぶ)、つまり"亜>井"とされるためです。 そのため、CurrentCulture
による比較の結果は、カルチャがja-JPとen-USの場合で異なります。
一方、InvariantCulture
の場合は特定の言語に依存しない規則に基づいて比較されるため、カルチャがja-JPでもen-USでも井の方が亜よりも小さいというどちらも同じ結果となります。 (参考: 固有カルチャのデータの比較と並べ替え)
CurrentCultureIgnoreCase
とInvariantCultureIgnoreCase
の場合もこれと同様の動作となります。
カルチャによって異なる規則とその詳細についてはカルチャによる動作の違いとインバリアントカルチャ §.文字列比較の規則・ソート順定義(CompareInfo)としてのCurrentCultureを参照してください。 また、カルチャそのものに関してはカルチャの基本・種類・カルチャ情報の取得を参照してください。
続いて、CurrentCultureIgnoreCase
とInvariantCultureIgnoreCase
でも違いが現れる例を見てみます。
トルコ語においては、i(U+0069)とI(U+0049)は大文字小文字の関係にある同じ文字ではなくそれぞれ発音の異なる文字であり、iの大文字はI(U+0049)ではなくİ(U+0131)で、Iの小文字はi(U+0069)ではなくı(U+0130)となります。
そのため、ja-JP(日本語/日本)の場合はCurrentCultureIgnoreCase
で大文字小文字を無視するとi(U+0069)とI(U+0049)は同じ文字として扱われ、tr-TR(トルコ語/トルコ)ではiとIは大文字小文字を無視しても異なる文字として扱われます。 一方InvariantCultureIgnoreCase
の場合は、特定の言語に依存しない規則に基づいて比較されるため、ja-JPでもtr-TRでも大文字小文字を無視するとi(U+0069)とI(U+0049)は同じ文字として扱われます。
このように、特定の言語や文化圏に依存した規則に基づいて比較を行いたい場合はCurrentCulture
/CurrentCultureIgnoreCase
、特定の言語や文化圏に依存しない規則に基づいて比較を行いたい場合はInvariantCulture
/InvariantCultureIgnoreCase
を使用する必要があります。
CurrentCultureとOrdinalの違い
CurrentCulture
とInvariantCulture
は特定のカルチャでの規則に基づいて比較を行いますが、一方Ordinal
ではカルチャに依存せず、文字列の各文字を数値(Unicode序数、Unicode ordinal)、つまりコードポイントで比較します。
CurrentCulture
の場合は亜(あ)の方が井(い)より小さい(前に並ぶ)、つまり"亜<井"とされます。
対してOrdnal
の場合は、井(U+4E95)の方が亜(U+4E9C)よりも小さい(前に並ぶ)、つまり"亜>井"とされるため、上記のような結果となります。 (0x4E9C - 0x4E95 = 0x0007 = 7である点に注目するとわかりやすいかもしれません)
また、次のような例をとって違いを見てみます。
CurrentCulture
の場合は辞書的な並びでの比較となり、"coop"は"co-op"よりも前、"cant"は"can't"よりも前、つまり"coop<co-op"、"cant<can't"という結果になります。
対してOrdinal
の場合は、"coop"と"co-op"の3文字目を比較するとo(U+006F)と-(U+002D)であるため"coop>co-op"という結果になります。 同様に、"cant"と"can't"の3文字目はt(U+0074)と'(U+0027)であるため"cant>can't"という結果になります。 (この結果も、0x006F - 0x002D = 0x0042 = 66、0x0074-0x0027 = 0x004D = 77である点に注目するとよりわかりやすいかもしれません)
CurrentCultureIgnoreCase
とOrdinalIgnoreCase
の場合もこれと同様の動作となります。
StringComparisonの使い分け
StringComparisonの各値の動作を再掲すると次のようになっています。
StringComparisonの値 | 文字列比較時の動作 |
---|---|
CurrentCulture
CurrentCultureIgnoreCase
|
現在のカルチャの並べ替え規則に基づいて比較する |
InvariantCulture
InvariantCultureIgnoreCase
|
インバリアントカルチャの並べ替え規則に基づいて比較する |
Ordinal
OrdinalIgnoreCase
|
文字列の各文字を数値(Unicode序数、Unicode ordinal)=コードポイントで比較する |
CurrentCulture
は設定されているカルチャによって結果が変わる可能性がありますが、その結果はカルチャに合わせた適切な文字列比較動作となっています。 したがって、UIで表示されるような文字列に対して使用するのが想定される主な適用範囲となります。 例えば、言語に合わせた表示順となるようにしたいといった場合は、CurrentCulture
が適していると考えられます。
一方、InvariantCulture
やOrdinal
はカルチャによらず一定の結果となります。 したがって、実行環境によって結果が変わることが望ましくない部分、例えば内部のソートや比較処理、ユーザーが直接編集しないファイルの入出力など、ロジック部分での文字列操作が想定される主な適用範囲となります。 CurrentCulture
ではなくInvariantCulture
が適している場合、どちらが望ましいかについてはカルチャによる動作の違いとインバリアントカルチャを参照してください。
CurrentCulture
やInvariantCulture
では、各文字の持つ意味的な側面(句読点や記号の扱い、アクセント記号の有無など)を考慮した比較となるため、あいまいな比較(あるいは自然な比較)でも構わない場合はこちらを使うことができます。 一方、バイト単位での比較のように、各文字の持つ意味的な側面は排除した上で、すべての文字を単なる数値ととらえ、文字種や言語環境の違いに関わらず等しく扱いたい場合はOrdinal
を使うのが望ましいと言えます。
StringComparerクラス
StringComparerクラスは文字列比較の実装を提供するクラスです。 IComparer<string>、IEqualityComparer<string>を実装しているため、これらのインターフェイスを使った文字列比較を行う際は、このクラスのインスタンスを使うことが出来ます。 また、StringComparisonと対応する実装を提供する静的プロパティも用意されています。
StringComparerのプロパティ | 同等なStringComparison |
---|---|
StringComparer.CurrentCulture | StringComparison.CurrentCulture |
StringComparer.CurrentCultureIgnoreCase | StringComparison.CurrentCultureIgnoreCase |
StringComparer.InvariantCulture | StringComparison.InvariantCulture |
StringComparer.InvariantCultureIgnoreCase | StringComparison.InvariantCultureIgnoreCase |
StringComparer.Ordinal | StringComparison.Ordinal |
StringComparer.OrdinalIgnoreCase | StringComparison.OrdinalIgnoreCase |
IComparer<T>インターフェイスの詳細や使用例・実装例については大小関係の定義と比較、IEqualityComparer<T>インターフェイスについては等価性の定義と比較を参照してください。
StringComparerとソート
例として、StringComparerとList<string>.Sortメソッドを使って、その結果の違いを見てみます。 List<string.Sortメソッドは並べ替え時の比較を行うためのIComparer<string>を引数にとるため、StringComparerを使用することが出来ます。
Listとソート順の定義については基本型のソートと昇順・降順でのソートを参照してください。
Dictionary<string, T>では、コンストラクタでキーの比較を行うためのIEqualityComparer<string>を指定することが出来るため、StringComparerを指定することでキーの大文字小文字を無視するディクショナリを作成することも出来ます。
Array.Sortメソッドも、ソート時の比較処理をIComparerで指定することが出来ます。 次のコードは、CurrentCultureとOrdinalでアラビア数字・漢数字・囲み文字を並べ替えたときの違いを出力する例です。
CurrentCulture
では、アラビア数字は数字の大きさ、漢数字は漢字の読みに従って並べ替えられ、Ordinal
ではコードポイントに従って並べ替えられていることが分かると思います。
CompareOptions列挙型
CompareOptions列挙型も、StringComparisonと同じく文字列比較の際の動作を指定するための列挙型ですが、StringComparisonよりも具体的な指定を行うことが出来ます。 StringComparisonの場合と異なり、StringクラスではCompareメソッドのみがCompareOptionsを指定した比較をサポートしています。
以下はString.CompareメソッドにCompareOptionsを指定して文字列の比較を行う例です。
CompareOptionsを指定する場合は、次の値を組み合わせて指定することができます。
CompareOptionsの値 | 文字列比較時の動作 | 解説 |
---|---|---|
None | デフォルトの動作で比較する | - |
IgnoreCase | 大文字小文字の違いを無視して比較する | 解説へ |
IgnoreKanaType | ひらがなとカタカナの違いを無視して比較する | |
IgnoreWidth | 全角と半角の違いを無視して比較する | |
IgnoreNonSpace | 濁点付きの文字、囲み文字や発音記号など、基本となる文字と修飾記号の組み合わせになる文字について、非スペーシング組み合わせ文字となる修飾記号を無視して比較する (例として、 "えと" と"えど" 、"cafe" と"café" 、"1" と"①" は同じ文字列として扱われる) |
解説へ |
IgnoreSymbols | 空白文字・句読点・その他の記号を無視して比較する (例として、 "Hello, world!" と"Helloworld" は同じ文字列として扱われる) |
解説へ |
StringSort | ハイフン・アポストロフィが英数字や他の記号よりも前になるように比較する (例として、 "can't" は"cant" より小さいとして扱われる) |
解説へ |
Ordinal | 文字列の各文字を数値(Unicode序数、Unicode ordinal)=コードポイントで比較する | (StringComparison.Ordinalと同じ) |
OrdinalIgnoreCase | 文字列の各文字を数値(Unicode序数、Unicode ordinal)=コードポイントで比較する 大文字小文字の違いは無視する |
(StringComparison.OrdinalIgnoreCaseと同じ) |
個々のオプションと動作の詳細については追って解説します。 なお、OrdinalおよびOrdinalIgnoreCaseは他の値とは組み合わせることはできないため、単独で使用する必要があります。
ソートやDictionaryのキー比較にCompareOptionsを使用する方法については§.CompareOptionsに対応するStringComparerの取得で追って解説します。
CompareOptionsとCultureInfo
String.CompareメソッドでCompareOptionsを指定する場合、必ずCultureInfoも指定する必要があります。 引数で指定されたCultureInfoでの定義にしたがった比較に加えてCompareOptionsで指定した比較オプションが適用されるため、例えCompareOptionsが同じでもCultureInfoが異なれば結果も異なる場合があります。
なお、OrdinalとOrdinalIgnoreCaseはCultureInfoでの定義ではなくコードポイントでの比較が行われるため、指定したCultureInfoによらず結果は一定です。
一方、StringComparisonでは現在のカルチャまたはインバリアントカルチャのいずれかのみが指定できますが、String.CompareメソッドでCompareOptionsを指定する場合ではインバリアントカルチャを含む任意のカルチャを指定することができます。
CompareOptionsとCultureInfoの組み合わせとStringComparisonの対応については§.CompareOptionsとStringComparisonで解説します。
CultureInfoクラスおよびカルチャ情報についてはカルチャの基本・種類・カルチャ情報の取得を参照してください。
CompareOptionsの値と文字列比較の動作
IgnoreCase, IgnoreKanaType, IgnoreWidth
CompareOptionsのうち、IgnoreCase, IgnoreKanaType, IgnoreWidthはそれぞれ大文字小文字、ひらがなとカタカナ、全角と半角を区別しないで比較するように指定します。 これらの値や他の値と組み合わせて使用することも出来ます。
IgnoreNonSpace
CompareOptionsのうち、IgnoreNonSpaceは濁点付きの文字、囲み文字や発音記号など、基本となる文字と修飾記号の組み合わせになる文字について、その組み合わせを無視して比較するように指定します。 これらの値や他の値と組み合わせて使用することも出来ます。 CompareOptions.IgnoreNonSpaceの解説では、
文字列比較で、発音区別符など、非スペーシング組み合わせ文字を無視するように指定します。 Unicode 標準は、新しい文字を生成するために基本文字と組み合わせられる文字を組み合わせ文字として定義しています。非スペーシング組み合わせ文字は、表示されるときに文字間隔用の領域は確保しません。
CompareOptions 列挙体
とされています。 非スペーシング組み合わせ文字とは、Unicodeのカテゴリ'Mark, Nonspacing' [Mn]のことで、これに該当する文字は比較の際に無視されることになります。
まずは、具体的な例と比較結果を見てみます。
個々の実行結果について、詳しく説明します。
- "cafe"と"café"
-
é(U+00E9 LATIN SMALL LETTER E WITH ACUTE)はe(U+0065 LATIN SMALL LETTER E)と́(U+0301 COMBINING ACUTE ACCENT)の組み合わせと等価とされています。
IgnoreNonSpaceの場合、カテゴリが'Mark, Nonspacing'である́(U+0301 COMBINING ACUTE ACCENT)が無視され、e(U+0065 LATIN SMALL LETTER E)として比較されるため、"cafe"と"café"は同じであると判断されます。 - "cat"と"cæt"
- æ(U+00E6 LATIN SMALL LETTER AE)は組み合わせた文字としては扱われないため、IgnoreNonSpaceの場合でも"cat"と"cæt"は異なると判断されます。
- "caet"と"cæt"
- インバリアントカルチャおよびja-JPでは"ae"と"æ"は同等であると判断されるため、NoneでもIgnoreNonSpaceでも"caet"と"cæt"は同じであると判断されます。
Ordinalの場合、a(U+0061 LATIN SMALL LETTER A)とæ(U+00E6 LATIN SMALL LETTER AE)はコードポイントが異なるため、"caet"と"cæt"は異なると判断されます。 - "えと"と"えど"
-
ど(U+3069 HIRAGANA LETTER DO)はと(U+3068 HIRAGANA LETTER TO)ど(U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK)の組み合わせと等価とされています。
IgnoreNonSpaceの場合、カテゴリが'Mark, Nonspacing'である゙(U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK)が無視され、と(U+3068 HIRAGANA LETTER TO)として比較されるため、"えと"と"えど"は同じであると判断されます。 - "ハン"と"パン"
"ウ"と"ヴ" -
パ(U+30D1 KATAKANA LETTER PA)はハ(U+30CF KATAKANA LETTER HA)と゚(U+309A COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK)の組み合わせ、ヴ(U+30F4 KATAKANA LETTER VU)はウ(U+30A6 KATAKANA LETTER U)ど(U+3099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK)の組み合わせと等価とされています。
従って"えと"と"えど"の場合と同様、IgnoreNonSpaceの場合は濁点・半濁点が無視され、"ハン"と"パン"、"ウ"と"ヴ"はそれぞれ同じであると判断されます。 - "バ゙ン"と"パン"
"◎゛ "と"●" -
ハ(U+30CF KATAKANA LETTER HA)に濁点が二つつけられたものとパ(U+30D1 KATAKANA LETTER PA)は等しくなります。 これは、濁点が基本となる文字に対して重み1を与え、半濁点が重み2を与えるためで、濁点二つと半濁点一つではどちらも同じ重みが与えられます。 その結果、"バ゙ン"と"パン"は同じであると判断されます。
◎(U+25CE BULLSEYE)に濁点がつけられたものと●(U+25CF BLACK CIRCLE)が等しくなるのもこれと同じで、濁点によって重みが与えらることにより、"◎゛ "と"●"は同じであると判断されます。
参考: 「MS ACCESS 95/97 の美しいソート順」の謎に答える - ものがたり - "C"と"©"
"C"と"Ⓒ" -
©(U+00A9 COPYRIGHT SIGN)は組み合わせた文字としては扱われないため、IgnoreNonSpaceの場合でも"C"と"©"は異なると判断されます。
一方Ⓒ(U+24B8 CIRCLED LATIN CAPITAL LETTER C)はC(U+0043 LATIN CAPITAL LETTER C)とほぼ等価とされているため、IgnoreNonSpaceの場合"C"と"Ⓒ"は同じであると判断されます。 - "1"と"①"
"1"と"①" -
①(U+2460 CIRCLED DIGIT ONE)は1(U+0031 DIGIT ONE)とほぼ等価とされているため、IgnoreNonSpaceの場合"1"と"①"は同じであると判断されます。
また、1(U+FF11 FULLWIDTH DIGIT ONE)は1(U+0031 DIGIT ONE)と全角半角の関係にあるため、IgnoreNonSpace+IgnoreWidthの場合"1"と"①"は同じであると判断されます。
IgnoreSymbols
(このドキュメントは未整理です)
IgnoreSymbolsは、空白文字、句読点等の記号を無視して比較するように指定します。 これらの値や他の値と組み合わせて使用することも出来ます。 CompareOptions.IgnoreSymbolsの解説では
文字列比較において、空白文字、句読点、通貨記号、パーセント記号、算術記号、アンパサンドなどの記号を無視することを示します。
CompareOptions 列挙体
とされているものの、具体的にどの記号が無視される対象なのかは明記されていないようです。 また、.NET FrameworkとMonoでも実行結果は異なるようです。
StringSort
(このドキュメントは未整理です)
StringSortは、ハイフン・アポストロフィが英数字や他の記号よりも前になるように比較するように指定します。 これらの値や他の値と組み合わせて使用することも出来ます。 CompareOptions.StringSortの解説では、
文字列の比較時に、文字列での並べ替えアルゴリズムを使用することを示します。文字列での並べ替えでは、ハイフン、アポストロフィ、およびその他の英数字以外の記号が英数字よりも前に来ます。
CompareOptions 列挙体
とされているものの、具体的にハイフン・アポストロフィ以外のどの記号が無視される対象なのかは明記されていないようです。 また、.NET FrameworkとMonoでも実行結果は異なるようです。
CompareOptionsとStringComparison
StringComparisonを指定した場合と同じ比較処理をCompareOptionsでも行うことが出来ます。 以下の表は、StringComparisonの値と、対応するCompareOptionsとCultureInfoの値の組み合わせです。
StringComparisonの値 | 対応するCompareOptionsとCultureInfoの組み合わせ | |
---|---|---|
CompareOptions | CultureInfo | |
StringComparison.Ordinal | CompareOptions.Ordinal | (任意のCultureInfo) |
StringComparison.OrdinalIgnoreCase | CompareOptions.OrdinalIgnoreCase | (任意のCultureInfo) |
StringComparison.CurrentCulture | CompareOptions.None | CultureInfo.CurrentCulture (またはThread.CurrentThread.CurrentCulture) |
StringComparison.CurrentCultureIgnoreCase | CompareOptions.IgnoreCase | CultureInfo.CurrentCulture (またはThread.CurrentThread.CurrentCulture) |
StringComparison.InvariantCulture | CompareOptions.None | CultureInfo.InvariantCulture |
StringComparison.InvariantCultureIgnoreCase | CompareOptions.IgnoreCase | CultureInfo.InvariantCulture |
次の例は、同じ比較処理をStringComparisonで指定した場合とCompareOptionsで指定した場合の例です。 記述は異なりますが、結果は同じです。
それぞれの結果の違いに関しては、§.CurrentCultureとInvariantCultureの違いおよび§.CurrentCultureとOrdinalの違いもあわせて参照してください。
CompareOptionsと部分文字列の探索・一致
String.Compareメソッドとは異なり、String.IndexOfなど部分文字列の探索と一致を検証するメソッドではStringComparisonを引数にとるオーバーロードは用意されていますが、CompareOptionsをとるオーバーロードは用意されていません。 CompareOptionsを使ってこれらの処理を行うには、CompareInfoクラスのメソッドを使う必要があります。
Stringクラスのメソッド | 代用できるCompareInfoクラスのメソッド |
---|---|
String.IndexOfメソッド | CompareInfo.IndexOfメソッド |
String.LastIndexOfメソッド | CompareInfo.LastIndexOfメソッド |
String.StartsWithメソッド | CompareInfo.IsPrefixメソッド |
String.EndsWithメソッド | CompareInfo.IsSuffixメソッド |
String.Equalsメソッド | (なし) |
なお、これらのメソッドでCompareOptions.StringSortを指定することはできません。 指定した場合はArgumentExceptionがスローされます。
次の例は、CompareInfoクラスの各メソッドを使った部分文字列の探索と一致の例です。
CompareOptionsに対応するStringComparerの取得
StringComparisonに対応するStringComparerとは異なり、IComparer<string>・IEqualityComparer<string>を実装するCompareOptionsに対応したクラスは直接提供されていませんが、GetStringComparer拡張メソッドを使用することにより、CompareOptionsに対応するStringComparerを取得することができます。 GetStringComparer拡張メソッドは、.NET Frameworkでは4.7.1以降で使用することができます。
Dictionaryのキー比較にCompareOptionsを使用する
GetStringComparer拡張メソッドで取得したStringComparerをDictionaryのコンストラクタに渡すことにより、CompareOptionsを使用したキーの比較を行うことができます。
例として、CompareOptions.IgnoreKanaType/IgnoreWidthを使って、キーのひらがなとカタカナの違い/全角と半角の違いを無視するDictionary<string, string>を作成するには次のようにします。
Dictionaryとキー比較のカスタマイズについてはジェネリックコレクション(2) Dictionary §.キー比較のカスタマイズ(大文字小文字の違いの無視)を参照してください。
4.7以前の.NET FrameworkでCompareOptionsを使用してDictionaryを作成する場合は、CompareInfo.CompareメソッドをラップしてIEqualityComparer<string>を実装するクラスを独自に実装する必要があります。
この例では、EqualityComparer<string>クラスを継承することでIEqualityComparer<string>インターフェイスを実装しています。 また、GetHashCodeメソッドの実装は省略していますが、オブジェクトのハッシュ値が使用される場合は適切に実装する必要があります。
EqualityComparer<T>についての解説や実装例については等価性の定義と比較 §.EqualityComparer<T>を参照してください。
ソートにCompareOptionsを使用する
List<string>.SortやArray.Sortの場合も同様に、GetStringComparer拡張メソッドで取得したStringComparerをSortメソッドに渡すことにより、CompareOptionsを使用したソートを行うことができます。
例として、CompareOptions.IgnoreKanaType/IgnoreWidthを使って、ひらがなとカタカナの違い/全角と半角の違いを無視してソートするには次のようにします。
.NET Framework 4.7以前の場合は、Comparison<string>デリゲートに適合するメソッドあるいはラムダ式を記述することで、CompareOptionsを使用したソートを行うことができます。
Comparison<T>デリゲートについては大小関係の定義と比較 §.Comparison<T>を参照してください。
ソートについて詳しくは基本型のソートと昇順・降順でのソートを参照してください。