string.compare(string,string) を使用していくつかの値をソートするアプリケーションがあります。私が理解できないのは、「1022」が「10-23」よりも小さく、「10-23」が「1024」よりも小さい理由です。
この結果を引き起こす「-」の値に固有のものはありますか? string.compare のそのオーバーロードは、同じ種類のデータ (ダッシュ付きの数値) に対して異なるカルチャ設定で同じ結果をもたらしますか?
string.compare(string,string) を使用していくつかの値をソートするアプリケーションがあります。私が理解できないのは、「1022」が「10-23」よりも小さく、「10-23」が「1024」よりも小さい理由です。
この結果を引き起こす「-」の値に固有のものはありますか? string.compare のそのオーバーロードは、同じ種類のデータ (ダッシュ付きの数値) に対して異なるカルチャ設定で同じ結果をもたらしますか?
string.Compare(String、String)のドキュメントから:
比較は、ワードソートルールを使用して実行されます。
そしてさらに:
.NET Frameworkは、単語の並べ替え、文字列の並べ替え、序数の並べ替えという3つの異なる並べ替え方法を使用します。ワードソートは、文化に敏感な文字列の比較を実行します。英数字以外の特定の文字には、特別な重みが割り当てられている場合があります。たとえば、ハイフン( "-")には非常に小さな重みが割り当てられているため、「coop」と「co-op」は並べ替えられたリストで隣り合って表示されます。文字列の並べ替えは、特別な場合がないことを除いて、単語の並べ替えに似ています。したがって、すべての英数字以外の記号は、すべての英数字の前に配置されます。序数ソートは、文字列の各要素のUnicode値に基づいて文字列を比較します。
Michael Kaplanの詳細:ソートキーのA&P、パート9(別名、常に推移的ではありませんが、句読点と句読点)。
まあ、ダッシュを無視することはかなり無実です。それらを含めたい場合は、おそらくStringComparison.Ordinal
オーバーロードで使用してください。
のドキュメントをstring.Compare
読むと、単語の並べ替えルールが使用されています。これは、ここから次のことを意味します。
ワードソートは、文化に敏感な文字列の比較を実行します。英数字以外の特定の文字には、特別な重みが割り当てられている場合があります。たとえば、ハイフン( "-")には非常に小さな重みが割り当てられているため、「coop」と「co-op」は並べ替えられたリストで隣り合って表示されます。
少なくとも推移的です。ダッシュを含む非常によく似たものについて「接続」のバグをログに記録しました。非推移的な比較は本質的に並べ替えのルールに違反するため、 A <B、B<CおよびC<Aです。「修正されません」で終了しました。ここにあります:
string s1 = "-0.67:-0.33:0.33";
string s2 = "0.67:-0.33:0.33";
string s3 = "-0.67:0.33:-0.33";
Console.WriteLine(s1.CompareTo(s2));
Console.WriteLine(s2.CompareTo(s3));
Console.WriteLine(s1.CompareTo(s3));
(私のマシンでは1,1、-1を返します)