21

大文字と小文字を区別しない文字列キー辞書が必要な場合、次の制約がある場合、どのバージョンのStringComparerを使用する必要がありますか。

  • 辞書のキーは、英語ロケールのみ(米国または英国)で記述されたC#コードまたは構成ファイルのいずれかから取得されます。
  • ソフトウェアは国際化されており、さまざまなロケールで実行されます

私は通常StringComparer.InvariantCultureIgnoreCaseを使用しますが、それが正しいケースかどうかはわかりませんでした。コード例は次のとおりです。

Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase);
4

7 に答える 7

32

比較子には次の 3 種類があります。

  • 文化を意識する
  • カルチャ インバリアント
  • 序数

各比較子には、大文字と小文字を区別するバージョンと、大文字と小文字を区別しないバージョンがあります。

序数比較子は、文字の序数値を使用します。これは最速の比較子であり、内部目的で使用する必要があります。

カルチャを認識する比較子は、現在のスレッドのカルチャに固有の側面を考慮します。「トルコ語 i」、「スペイン語 LL」などの問題を知っています。UI 文字列に使用する必要があります。

カルチャ不変の比較子は実際には定義されておらず、予測できない結果を生成する可能性があるため、決して使用しないでください。

参考文献

  1. Microsoft .NET 2.0 での文字列の使用に関する新しい推奨事項
于 2008-10-09T20:28:39.670 に答える
12

この MSDN の記事では、Turkish-I の問題を含め、知りたいと思われるすべてのことについて詳しく説明しています。

久しぶりに読んだので、また読もうと思います。1時間後に会いましょう!

于 2008-10-09T20:33:29.207 に答える
3

「大文字と小文字を区別しない」という概念は言語的なものであるため、文化がなければ意味がありません。

詳細については、このブログを参照してください。

とは言っても、ラテン アルファベットを使用した文字列について話しているだけなら、おそらく InvariantCulture で問題を解決できます。

ただし、StringComparer.CurrentCulture を使用して辞書を作成するのがおそらく最善です。これにより、たとえば、ドイツ語のカルチャの下で辞書の「ß」が「ss」と一致するようになります。

于 2008-10-09T17:18:52.643 に答える
1

キーは既知の固定値であるため、InvariantCultureIgnoreCase または OrdinalIgnoreCase のいずれかが機能するはずです。文化固有のものは避けてください。そうしないと、「トルコ語 i」の問題など、より「楽しい」ものにぶつかる可能性があります。明らかに、培養された値を比較する場合は、培養された比較子を使用します...しかし、そうではないようです。

于 2008-10-09T17:16:07.220 に答える
1

StringComparer.OrdinalIgnoreCase は、InvariantCultureIgnoreCase FWIW よりもわずかに高速です ( MSDNによると、「序数比較は高速ですが、カルチャに依存しません」。

もちろん、違いに気付くには、多くの比較を行う必要があります。

于 2008-10-09T17:20:49.410 に答える
0

System.Collections.SpecializedにはStringDictionaryが含まれています。MSDNの備考セクションには、「キーをnullにすることはできませんが、値をnullにすることはできます。

キーは大文字と小文字を区別せずに処理されます。文字列辞書で使用される前に小文字に変換されます。

.NET Frameworkバージョン1.0では、このクラスはカルチャに依存する文字列比較を使用します。ただし、.NET Frameworkバージョン1.1以降では、このクラスは文字列を比較するときにCultureInfo.InvariantCultureを使用します。カルチャが比較と並べ替えにどのように影響するかについての詳細は、特定のカルチャのデータの比較と並べ替え、およびカルチャに依存しない文字列操作の実行を参照してください。

于 2008-10-14T04:08:42.253 に答える
0

インバリアント カルチャは、特にプログラム内部の文字列を処理するために存在し、ユーザー データや UI とは何の関係もありません。これは、この状況の場合のようです。

于 2008-10-09T17:27:58.163 に答える