2015-09-23 8 views
11

Best Practices for Using Strings in the .NET Frameworkには、大文字と小文字を区別しないファイルパスにStringComparison OrdinalIgnoreCaseを使用することをお勧めします。彼らのファイル名が同じではありませんToUpperInvariant() - 推奨のMSDNが間違っていますか?

é.txt 
é.txt 

、二つ目はeから構成されており、私は同じディレクトリに2つのファイルを作成することができますので、私は、それに同意することができます

を(のは、ステートメントA.それを呼びましょう)修飾子なので、実際には2つの文字があります。

不変の文化比較があって効果的でない場合、NTFSはこれらのファイルを許可しません。これは、同じ記事で説明するように、不変の文化a + ̊ = å

しかしString.ToUpperInvariant()上の記事であっ異なるオススメです:あなたが名前付きパイプファイル名などのオペレーティングシステム識別子、の小文字または大文字のバージョンが必要な場合(ステートメントB.)

は、またはレジストリキーを使用するには、ToLowerInvariantメソッドまたはToUpperInvariantメソッドを使用します。

重複を検出するためにファイルパスコレクション(実際はHashSet)を作成する必要があります。したがって、マップを作成するときに文Bに従うと、上記のファイル名é.txté.txtが1つとみなされるため、誤認で終わることがあります。 MSDNで見つかったステートメントBが誤解を招くということを正しく理解していますか?または私は何かを逃している?

私はライブラリーを構築しようとしています。ライブラリーは、最初から知られていないバグがなくても構いませんので、これを無視したくありません。

更新:ToLowerInvariant()実際に使用することはできません。

書Bは、1つのより多くの問題を持っているようです。理由(私はベストプラクティスの記事を引用):DO: Use ToUpperInvariant rather than ToLowerInvariant when normalizing strings for comparison.実際の理由:There is a small range of characters that do not roundtrip, and going to lowercase will make these characters unavailable.source)あなたが平等のための大文字と小文字を区別せずには文字列を比較したい場合

+3

「オペレーティングシステム識別子の小文字または大文字のバージョン」は、「オペレーティングシステム識別子を小文字または大文字のバージョンに明白にマッピングする」と同じ意味になっています。また、「システムのロケールに関係なく同じ方法で動作する、ユニークでない小文字または大文字のバージョンへのオペレーティングシステム識別子のマッピング」を意味する場合もあります。 –

+0

OTですが、あなたのライブラリが何をしているかを知っている人:NTFSでは、ファイル名に ':'、 '*'や '?'を使うこともできます。それはそれをサポートしていないWindowsだけです。このようなファイルをLinux上のNTFS上に作成するのは簡単です。 –

+0

@ O.R.Mapper - その文を読む良い方法...この文脈では論理的に見えます。一方、ファイル名の記載を省略したり、一意ではない短い注釈を追加することもできます。 – miroxlav

答えて

5

どちらも大文字化や小文字が正しいです。両方の変種には、これを台無しにする文字があります。

文字列を大文字と小文字を区別しないで比較する正しい方法は、無効なStringComparisonオプションのいずれかを使用することです(これはわかっています)。

大文字小文字を区別しないデータ構造を使用する正しい方法は、StringComparer.*IgnoreCaseのいずれかを使用することです。たとえば:

new HashSet<string>(StringComparer.InvariantCultureIgnoreCase) 

は、データ構造に追加する前ない大文字の文字列を実行してください。私は、コードレビューでそれを失敗するでしょう。

オペレーティング・システム識別子

の小文字または大文字のバージョンが必要な場合には、そのようなものとしては必要ありません。この声明はあなたのケースには当てはまりません。

+0

したがって、NTFSのファイル名の場合、これは '新しいHashSet (StringComparer.OrdinalIgnoreCase)'(または、特定のケースでNTFSの大文字と小文字の区別がどのように切り替わるかに応じて、 'OrdinalCase'のみ)を意味します。 – miroxlav

+0

私はNTFSがどのような種類の比較を使用しているのか分かりません。設定が可能です。各NTFSボリュームには、Unicodeケースマッピングテーブルを格納する隠しファイルがあります。私はそれが恣意的であるかもしれないと思う。それが実際に何であるか分かりません。 – usr

+0

はい私はそれを知っています...それは、実際には '$ UpCase'ファイルの内容に基づいて動作する' NtfsIgnoreCase'のようなものが必要かもしれないということを意味しています: – miroxlav

関連する問題