一般に、StringComparison.OrdinalIgnoreCase と StringComparison.InvariantCultureIgnoreCase のどちらを使用するのが最適ですか?

StackOverflow https://stackoverflow.com/questions/72696

  •  09-06-2019
  •  | 
  •  

質問

次のようなコードがあります。

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 これにより、本質的に記号的な文字列の言語的解釈によるバグが回避されるだけでなく、パフォーマンスが向上します。

他のヒント

すべては状況次第です

Unicode 文字列の比較は困難です。

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

見る: http://en.wikipedia.org/wiki/Unicode_equivalence


大文字と小文字を区別しない方法で 2 つの Unicode 文字列を比較しようとしていて、それを機能させたい場合 どこにでも, 、不可能な問題があります。

古典的な例は次のとおりです トルコ語の「私」, 、大文字にすると İ になります (ドットに注目してください)

デフォルトでは、.Net フレームワークは通常、 現在の文化 文字列関連関数の場合、非常に重要な例外を除きます。 .Equals 序数 (バイトごと) の比較を使用します。

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


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

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

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

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

Unicode の等価性ルールは複雑であるため、方法 1) または 2) を使用する方がコストが高くなります。 OrdinalIgnoreCase. 。事実 OrdinalIgnoreCase 特別な Unicode 正規化は実行されません。これは、一部の文字列がコンピュータ画面上で同じようにレンダリングされることを意味します。 しない 同一とみなされます。例えば: "\u0061\u030a" そして "\u00e5" どちらも å を表現します。ただし、順序比較では異なるものとみなされます。

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

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

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

また、OrdinalIgnoreCase は 非常に特殊な種類 つまり、辞書編集的な側面がいくつか混ざった順序比較のようなものを選んで選択することです。これは混乱を招く可能性があります。

MSDN は、これに関して非常に明確な推奨事項をいくつか示しています。 http://msdn.microsoft.com/en-us/library/ms973919.aspx

それはあなたの状況によると思います。順序比較は実際には文字の Unicode 数値を参照するため、アルファベット順に並べ替える場合には最良の選択ではありません。ただし、文字列比較の場合は、序数を使用した方が少し速くなります。

それはあなたが何を望むかによりますが、そうでない限り、私は invariantculture を避けるでしょう。 とても コードを他の言語にローカライズする必要は決してありません。代わりに CurrentCulture を使用してください。

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top