Редактировать (заключение. Финал. Конец.): это ошибка.
См. Отчет об ошибке Ошибка в списке.Sort () [.NET35] в списке, который содержит double.NaN и идет, чтобы дать Ханс Пассанту право голоса на Почему .NET 4.0 сортирует этот массив иначе, чем .NET 3.5? изкоторый я разорвал по ссылке.
Исторические размышления
[Смотрите пост: Почему .NET 4.0 сортирует этот массив иначе, чем .NET 3.5? , где, как мы надеемся,Более полезное обсуждение этого конкретного вопроса можно выяснить по-настоящему.Я также отправил туда этот ответ.]
Поведение, указанное Филом в .NET4, определено в CompareTo.См. double.CompareTo для .NET4.Это то же самое поведение, что и в .NET35, однако должно быть согласованным в обеих версиях, согласно документации метода ...
Array.Sort(double[])
: не похожеиспользуя CompareTo(double[])
, как и ожидалось, и это может быть ошибкой - обратите внимание на разницу в Array.Sort (object []) и Array.Sort (double []) ниже .Я хотел бы получить разъяснения / исправления по следующим вопросам:
В любом случае ответы с использованием >
и <
и ==
объясняют, почему эти операторы не работают , но не может объяснить , почему 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
реализации каждого элемента массива.
Аналогично, 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
Хмм.В самом деле.В заключение:
У меня нет ИДЕИ.
Удачного кодирования.