私はこのようないくつかのコードを持っています:
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
に文字列の比較、大文字小文字の区別、並べ替えにを使用していたコード所有者はString
、Microsoft .NET 2.0で新しいオーバーロードのセットを使用することを強く検討する必要があります。具体的には、文化にとらわれず、言語的に無関係になるように設計されたデータは、新しい列挙のStringComparison.Ordinal
またはStringComparison.OrdinalIgnoreCase
メンバーのいずれかを使用して、オーバーロードの指定を開始する必要がありStringComparison
ます。これらstrcmp
は、本質的にシンボリック文字列の言語解釈によるバグを回避するだけでなく、より良いパフォーマンスを提供するのと同様に、バイトごとの比較を強制します。
"Straße"
とを考えます"STRASSE"
。戻り値を使用OrdinalIgnoreCase
する場合、それは等しいと言います。Equals
false
InvariantCultureIgnoreCase
ユニコード文字列の比較は難しいです:
テキスト処理ソフトウェアでのUnicode文字列の検索と比較の実装では、同等のコードポイントの存在を考慮する必要があります。この機能がない場合、特定のコードポイントシーケンスを検索するユーザーは、異なるが、標準的には同等のコードポイント表現を持つ他の視覚的に区別できないグリフを見つけることができません。
参照:http : //en.wikipedia.org/wiki/Unicode_equivalence
大文字と小文字を区別しない方法で2つのUnicode文字列を比較しようとしていて、それをEVERYWHEREで機能させたい場合は、不可能な問題があります。
古典的な例はトルコ語のiで、大文字にするとİ(ドットに注意)になります。
デフォルトでは、.Netフレームワークは通常、文字列関連の関数にCurrentCultureを.Equals
使用しますが、序数(バイト単位)比較を使用するという非常に重要な例外があります。
これにより、設計上、コンピュータのカルチャに応じて動作が異なるさまざまな文字列関数が生成されます。
それでも、「一般的な目的」で、大文字と小文字を区別せずに比較したい場合があります。
たとえば、アプリケーションがインストールされているコンピューターに関係なく、文字列比較を同じように動作させることができます。
これを実現するには、3つのオプションがあります。
Unicode正規化ルールは、より高価である手段方法1)または2を使用して)、複雑ですOrdinalIgnoreCase
。OrdinalIgnoreCase
特別なユニコード正規化を実行しないという事実は、コンピューター画面で同じようにレンダリングされる一部の文字列は同一とは見なされないことを意味します。たとえば、次のように"\u0061\u030a"
と"\u00e5"
の両方åレンダリングします。ただし、序数比較では異なると見なされます。
どちらを選択するかは、構築するアプリケーションによって大きく異なります。
マイクロソフトには、明確なガイドラインを含む一連の推奨事項があります。ただし、これらの問題に取り組む前に、Unicodeの同等性の概念を理解することは本当に重要です。
また、OrdinalIgnoreCaseは非常に特殊な種類の獣であることを覚えておいてください。それは、辞書式のいくつかの混合されたものと少し序数を比較して選ぶことです。これは混乱を招く可能性があります。
あなたがしている場合を除き、私はにInvariantCultureから敬遠したいけれどもそれは、あなたが望むものに依存して非常にあなたが他の言語のコードをローカライズすることは決してないだろう。代わりにCurrentCultureを使用してください。
また、OrdinalIgnoreCaseは数値を尊重する必要があります。これは、必要な場合とそうでない場合があります。
非常に簡単な答えは、トルコ語を使用しているのでなければ、InvariantCultureを使用する必要はないということです。
次のリンクを参照してください。