私はこのようなコードを持っています:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
私はその事件を気にしません。OrdinalIgnoreCase
、、、InvariantCultureIgnoreCase
またはを使用する必要がありますCurrentCultureIgnoreCase
か?
私はこのようなコードを持っています:
If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
DoSomething()
End If
私はその事件を気にしません。OrdinalIgnoreCase
、、、InvariantCultureIgnoreCase
またはを使用する必要がありますCurrentCultureIgnoreCase
か?
新しい .Net Docs には、状況に応じてどちらを使用するのが最適かを判断するのに役立つ表があります。
MSDN の「Microsoft .NET 2.0 で文字列を使用するための新しい推奨事項」より
InvariantCulture
概要: 以前にfor 文字列の比較、大文字と小文字の区別、および並べ替えを使用していたコード所有者はString
、Microsoft .NET 2.0 で新しいオーバーロードのセットを使用することを強く検討する必要があります。具体的には、カルチャに依存せず、言語的に無関係になるように設計されたデータは、新しい列挙型のStringComparison.Ordinal
またはStringComparison.OrdinalIgnoreCase
のメンバーを使用して、オーバーロードの指定を開始する必要があります。これらは、基本的にシンボリック文字列の言語解釈によるバグを回避するだけでなく、より優れたパフォーマンスを提供するのStringComparison
と同様のバイト単位の比較を強制します。strcmp
Unicode 文字列の比較は難しい:
テキスト処理ソフトウェアでの Unicode 文字列の検索と比較の実装では、同等のコード ポイントの存在を考慮する必要があります。この機能がないと、特定のコード ポイント シーケンスを検索するユーザーは、異なるが標準的に同等のコード ポイント表現を持つ他の視覚的に区別できないグリフを見つけることができません。
参照: http://en.wikipedia.org/wiki/Unicode_equivalence
大文字と小文字を区別しない方法で 2 つの Unicode 文字列を比較しようとしていて、それをEVERYWHEREで動作させたい場合、不可能な問題が発生します。
古典的な例はトルコ語の iで、大文字の場合は İ になります (ドットに注意してください)。
デフォルトでは、.Net フレームワークは通常、文字列関連の関数にCurrentCulture.Equals
を使用しますが、序数 (バイトごと) の比較を使用するという非常に重要な例外があります。
これは、設計上、さまざまな文字列関数がコンピューターの文化に応じて異なる動作をすることにつながります。
それにもかかわらず、「汎用」で大文字と小文字を区別しない比較が必要な場合があります。
たとえば、アプリケーションがインストールされているコンピューターに関係なく、文字列比較を同じように動作させたい場合があります。
これを実現するには、3 つのオプションがあります。
Unicode の等価規則は複雑です。つまり、方法 1) または 2) を使用すると、OrdinalIgnoreCase
. OrdinalIgnoreCase
が特別な Unicode 正規化を実行しないという事実は、コンピューター画面で同じようにレンダリングされる一部の文字列が同一とは見なされないことを意味します。例: "\u0061\u030a"
and"\u00e5"
どちらも å をレンダリングします。ただし、序数比較では異なると見なされます。
どちらを選択するかは、構築しているアプリケーションによって大きく異なります。
Microsoft には、明確なガイドラインを含む一連の推奨事項があります。ただし、これらの問題に取り組む前に、Unicode の等価性の概念を理解することが非常に重要です。
また、OrdinalIgnoreCase は非常に特別な種類の獣であることに注意してください。つまり、辞書編集の側面が混在するものと比較して、序数のビットを選択して選択します。これは混乱を招く可能性があります。
あなたの状況にもよると思います。序数比較は実際には文字の数値 Unicode 値を調べているため、アルファベット順にソートする場合は最良の選択ではありません。ただし、文字列比較の場合は、序数の方が少し高速です。
それはあなたが望むものに依存しますが、他の言語のコードをローカライズしたくないと確信しているのでない限り、私は不変文化を避けたいと思います。代わりにCurrentCultureを使用してください。
また、OrdinalIgnoreCaseは数値を尊重する必要がありますが、これは希望する場合とそうでない場合があります。
非常に簡単な答えは、トルコ語を使用していない限り、InvariantCulture を使用する必要はないということです。
次のリンクを参照してください。