編集(結論。最終。終了。):これはバグです。
double.NaNを含むリストのBug - reportBugin List <double / single> .Sort()[.NET35]を参照して、HansPassantに賛成票を投じてください。.NET4.0がこの配列を.NETとは異なる方法でソートする理由3.5?そこからリンクをリッピングしました。
歴史的考察
[投稿を参照してください:.NET4.0がこの配列を.NET3.5とは異なる方法でソートするのはなぜですか?、うまくいけば、この特定の問題に関するより有用な議論を実際に理解することができます。私もこの回答をクロスポストしました。]
Philが.NET4で指摘した動作は、CompareToで定義された動作です。.NET4のdouble.CompareToを参照してください。これは.NET35と同じ動作ですが、メソッドのドキュメントに従って、両方のバージョンで一貫している必要があります...
Array.Sort(double[])
:期待どおりに使用されていないようです。CompareTo(double[])
これはバグである可能性があります。以下のArray.Sort(object [])とArray.Sort(double [])の違いに注意してください。以下の説明/訂正をお願いします。
いずれにせよ、>
andを使用した回答は、これらの演算子が機能しない理由<
を説明していますが、予期しない出力につながる理由を説明できていません。ここに私の発見のいくつかがありますが、それらはわずかかもしれません。==
Array.Sort
まず、double.CompareTo(T)
メソッドのドキュメント-この順序は、ドキュメントに従って明確に定義されています。
ゼロ未満:このインスタンスは値未満です。-または-このインスタンスは数値(NaN)ではなく、値は数値です。
ゼロ:このインスタンスは値と同じです。-または-このインスタンスと値はどちらも数値(NaN)、PositiveInfinity、またはNegativeInfinityではありません。
ゼロより大きい:このインスタンスは値より大きい。-または-このインスタンスは数値であり、値は数値(NaN)ではありません。
LINQPad(3.5と4はどちらも同じ結果になります):
0d.CompareTo(0d).Dump(); // 0
double.NaN.CompareTo(0d).Dump(); // -1
double.NaN.CompareTo(double.NaN).Dump(); // 0
0d.CompareTo(double.NaN).Dump(); // 1
使用しCompareTo(object)
ても同じ結果になります。
0d.CompareTo((object)0d).Dump(); // 0
double.NaN.CompareTo((object)0d).Dump(); // -1
double.NaN.CompareTo((object)double.NaN).Dump(); // 0
0d.CompareTo((object)double.NaN).Dump(); // 1
だからそれは問題ではありません。
さて、Array.Sort(object[])
ドキュメンテーションから- 、、または(ドキュメンテーションによると)の使用はありません>
<
==
-ただCompareTo(object)
。
IComparable
配列の各要素の実装を使用して、1次元配列全体の要素を並べ替えます。
同様に、Array.Sort(T[])
を使用しCompareTo(T)
ます。
配列の各要素のIComparable(Of T)ジェネリックインターフェイス実装を使用して、配列全体の要素を並べ替えます。
どれどれ:
LINQPad(4):
var ar = new double[] {double.NaN, 0, 1, double.NaN};
Array.Sort(ar);
ar.Dump();
// NaN, NaN, 0, 1
LINQPad(3.5):
var ar = new double[] {double.NaN, 0, 1, double.NaN};
Array.Sort(ar);
ar.Dump();
// NaN, 0, NaN, 1
LINQPad(3.5)-アレイCompareTo
は目的のものであり、動作は契約ごとに「期待される」ことに注意してください。
var ar = new object[] {double.NaN, 0d, 1d, double.NaN};
Array.Sort(ar);
ar.Dump();
// NaN, NaN, 0, 1
うーん。本当に。結論は:
何も思いつきません。
ハッピーコーディング。