188

私はこのようなコードを持っています:

If key.Equals("search", StringComparison.OrdinalIgnoreCase) Then
    DoSomething()
End If

私はその事件を気にしません。OrdinalIgnoreCase、、、InvariantCultureIgnoreCaseまたはを使用する必要がありますCurrentCultureIgnoreCaseか?

4

5 に答える 5

202

新しい .Net Docs には、状況に応じてどちらを使用するのが最適かを判断するのに役立つ表があります。

MSDN の「Microsoft .NET 2.0 で文字列を使用するための新しい推奨事項」より

InvariantCulture概要: 以前にfor 文字列の比較、大文字と小文字の区別、および並べ替えを使用していたコード所有者はString、Microsoft .NET 2.0 で新しいオーバーロードのセットを使用することを強く検討する必要があります。具体的には、カルチャに依存せず、言語的に無関係になるように設計されたデータは、新しい列挙型のStringComparison.OrdinalまたはStringComparison.OrdinalIgnoreCaseのメンバーを使用して、オーバーロードの指定を開始する必要があります。これらは、基本的にシンボリック文字列の言語解釈によるバグを回避するだけでなく、より優れたパフォーマンスを提供するのStringComparisonと同様のバイト単位の比較を強制します。strcmp

于 2008-09-16T14:16:42.160 に答える
69

それはすべて依存します

Unicode 文字列の比較は難しい:

テキスト処理ソフトウェアでの Unicode 文字列の検索と比較の実装では、同等のコード ポイントの存在を考慮する必要があります。この機能がないと、特定のコード ポイント シーケンスを検索するユーザーは、異なるが標準的に同等のコード ポイント表現を持つ他の視覚的に区別できないグリフを見つけることができません。

参照: http://en.wikipedia.org/wiki/Unicode_equivalence


大文字と小文字を区別しない方法で 2 つの Unicode 文字列を比較しようとしていて、それをEVERYWHEREで動作させたい場合、不可能な問題が発生します。

古典的な例はトルコ語の iで、大文字の場合は İ になります (ドットに注意してください)。

デフォルトでは、.Net フレームワークは通常、文字列関連の関数にCurrentCulture.Equalsを使用しますが、序数 (バイトごと) の比較を使用するという非常に重要な例外があります。

これは、設計上、さまざまな文字列関数がコンピューターの文化に応じて異なる動作をすることにつながります。


それにもかかわらず、「汎用」で大文字と小文字を区別しない比較が必要な場合があります。

たとえば、アプリケーションがインストールされているコンピューターに関係なく、文字列比較を同じように動作させたい場合があります。

これを実現するには、3 つのオプションがあります。

  1. カルチャを明示的に設定し、ユニコード等価規則を使用して大文字と小文字を区別しない比較を実行します。
  2. カルチャをインバリアント カルチャに設定し、Unicode 等価規則を使用して大文字と小文字を区別しない比較を実行します。
  3. InvariantCulture を使用して文字列を大文字にし、バイトごとの比較を実行するOrdinalIgnoreCaseを使用します。

Unicode の等価規則は複雑です。つまり、方法 1) または 2) を使用すると、OrdinalIgnoreCase. OrdinalIgnoreCaseが特別な Unicode 正規化を実行しないという事実は、コンピューター画面で同じようにレンダリングされる一部の文字列が同一とは見なされないことを意味します。例: "\u0061\u030a"and"\u00e5"どちらも å をレンダリングします。ただし、序数比較では異なると見なされます。

どちらを選択するかは、構築しているアプリケーションによって大きく異なります。

  • トルコのユーザーのみが使用する基幹業務アプリを作成している場合は、必ず方法 1 を使用します。
  • 単純な「偽の」大文字と小文字を区別しない比較が必要な場合、たとえば、通常は英語のデータベースの列名など、おそらく方法 3 を使用します。

Microsoft には、明確なガイドラインを含む一連の推奨事項があります。ただし、これらの問題に取り組む前に、Unicode の等価性の概念を理解することが非常に重要です。

また、OrdinalIgnoreCase は非常に特別な種類の獣であることに注意してください。つまり、辞書編集の側面が混在するものと比較して、序数のビットを選択して選択します。これは混乱を招く可能性があります。

于 2011-06-20T02:16:53.377 に答える
4

あなたの状況にもよると思います。序数比較は実際には文字の数値 Unicode 値を調べているため、アルファベット順にソートする場合は最良の選択ではありません。ただし、文字列比較の場合は、序数の方が少し高速です。

于 2008-09-16T14:17:22.130 に答える
1

それはあなたが望むものに依存しますが、他の言語のコードをローカライズしたくないと確信しているのでない限り、私は不変文化を避けたいと思います。代わりにCurrentCultureを使用してください。

また、OrdinalIgnoreCaseは数値を尊重する必要がありますが、これは希望する場合とそうでない場合があります。

于 2008-09-16T14:13:00.487 に答える
-2

非常に簡単な答えは、トルコ語を使用していない限り、InvariantCulture を使用する必要はないということです。

次のリンクを参照してください。

C# では、ToUpper() と ToUpperInvariant() の違いは何ですか?

于 2012-07-18T19:32:51.783 に答える