2017-03-26 21 views
3

このコードフラグメントを考えてみましょう:私のシステムでなぜ "1.0" <"-1.0" <"1.1"ですか?

var sorted = new[] { "-1.0", "0.0", "1.0", "1.1", "2.0" } 
    .OrderBy (s => s) 
    .ToArray(); 
Console.WriteLine (string.Join (", ", sorted)); 

をこれは-のASCIIコードは、私が-1.0, 0.0, 1.0, 1.1, 2.0を予想数字ASCIIコードよりも小さいであることを考えると

0.0, 1.0, -1.0, 1.1, 2.0 

を印刷します。

-1.01.01.1である理由それは間違いなく私を混乱させる。それらの2つは同じ文字で始まるので、それらの間のものは1で始まる必要があります。

文化やロケールの設定がこれに影響すると漠然と思われますが、ドイツ語と英語が混在していますが、上記の場合は英語やインバリアントと違いはありません。 MSDNドキュメントString.Compareあたりとして

+1

comparerメソッドを直接呼び出すと(つまり、 'string'のデフォルトの比較文字列)、自分で答えを見つけることができます。あなたはこれを何とか調べようとしましたか?これまで何をしていますか?あなたの質問は私にかなり怠惰だと思われます。実際に掘り下げて何が起こっているのかを見るためには、疑いはありません。 –

+0

[OrderBy'のドキュメント(https://msdn.microsoft.com/en-us/library/bb534966(v=vs.110).aspx)が役に立ちますか? –

+3

これはすべてドキュメントに説明されています。順序を行うためにどのメソッドが呼び出されているか( 'CompareTo')を見て、記述した注釈を見てください。確かにそれはSOを求めるよりもむしろアクションの最初のコースでなければならない。 –

答えて

8

:発信者に対して

注:文字セットは無視できる文字が含まれています。 言語または文化依存の比較を実行すると、Compare(String、Int32、String、Int32、Int32、CultureInfo、CompareOptions) メソッドはこれらの文字を考慮しません。比較中に無視できる文字( )を認識するには、 オプションパラメータの値を CompareOptions.OrdinalまたはCompareOptions.OrdinalIgnoreCaseに設定します。

StringComparer.Ordinalを追加すると、期待どおりに動作します。だから、

 var sorted = new[] { "-1.0", "0.0", "1.0", "1.1", "2.0" } 
      .OrderBy(s => s, StringComparer.Ordinal) 
      .ToArray(); 
     Console.WriteLine(string.Join(", ", sorted)); 

あなたは-は完全に.NET Frameworkが3つの異なる方法を使用していますMSDN CompareOptions Enumeration Remakrs

あたりとして"-1.0""1.0"も同じ

であることを意味し、無視されます見ることができるようにソート:単語ソート、 文字列ソート、序数ソート。 Wordソートは、文化の影響を受けやすい文字列の比較を実行します( )。特定の非英数字の文字には、 の特別な重みが割り当てられている場合があります。たとえば、 "coop"と "co-op" が並べ替えられたリストの隣に表示されるように、ハイフン( " - ")は に割り当てられた非常に小さな重みを持つことがあります。文字列の並べ替えは、特別な場合を除いて、 の単語の並べ替えに似ています。したがって、英数字以外のすべての英数字の前には、 の非英数記号が付いています。 序数ソートは、文字列の各 要素のUnicode値に基づいて文字列を比較します。

+0

ハイフンが明示的に呼び出される追加の読み取り:https://msdn.microsoft.com/en-us/library/35f0x18w(v=vs.110).aspx –

+0

'たとえば、次のコードが.NET Framework 4以降では、 "動物"と "アニマル"(ソフトハイフンまたはU + 00ADを使用)を比較すると、2つの文字列が同等であることが示されます。 フレームワーク4では変更されましたか?私はこれを文書化しているページを見つけることができませんでした。 – mafu

+0

次のhttps://msdn.microsoft.com/en-us/library/system.globalization.compareoptions(v=vs.110).aspxを参照してください。 –

関連する問題