[Esta es mi respuesta descarada arrancada de la otra publicación. Sería bueno que alguien es explorado más a fondo - double.CompareTo
y double.CompareTo(double)
están bien definidos, tal como se indica a continuación así que sospecho que hay algo mágico suceda Array.Sort
para el tipo específico]
Array.Sort(double[])
:. no parece estar usando CompareTo(double[])
como se esperaba y esto puede ser un error - observe la diferencia en Array.Sort (objeto []) y Array.Sort (doble []) debajo de. Me encantaría aclaraciones/correcciones sobre lo siguiente.
En primer lugar, la documentación double.CompareTo(T)
método - esta ordenación está bien definido de acuerdo con la documentación:
Menos de cero: este caso es menor que el valor. -o-- Esta instancia no es un número (NaN) y el valor es un número.
Zero: Esta instancia es igual al valor. -o-- Tanto esta instancia como el valor no son un número (NaN), PositiveInfinity o NegativeInfinity.
Mayor que cero: este caso es mayor que el valor. -o-- Esta instancia es un número y el valor no es un número (NaN).
En LINQPad (3,5 y 4, ambos tienen los mismos resultados):
0d.CompareTo(0d).Dump(); // 0
double.NaN.CompareTo(0d).Dump(); // -1
double.NaN.CompareTo(double.NaN).Dump(); // 0
0d.CompareTo(double.NaN).Dump(); // 1
Usando CompareTo(object)
tiene los mismos resultados:
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
Así que ese no es el problema.
Ahora, a partir de la documentación Array.Sort(object[])
- no hay uso de >
, <
o ==
(según la documentación) - sólo CompareTo(object)
.
Ordena los elementos en toda una matriz unidimensional utilizando el IComparable
aplicación de cada elemento de la matriz.
Asimismo, Array.Sort(T[])
utiliza CompareTo(T)
.
Ordena los elementos de una matriz completa usando el IComparable (Of T) implementación de la interfaz genérica de cada elemento de la matriz.
Veamos:
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) - NOTA La matriz se DEL OBJETO y el comportamiento es "esperado" según el CompareTo
contrato.
var ar = new object[] {double.NaN, 0d, 1d, double.NaN};
Array.Sort(ar);
ar.Dump();
// NaN, NaN, 0, 1
Hmm. De Verdad. En conclusión:
no tengo ni idea - pero yo sospecho hay algo de "optimización", resultando en CompareTo(double)
no se invoque.
Happy coding.
sospecho que no hay una buena razón; probablemente solo un descuido de Microsoft. – Jacob
Sé que arreglaron un par de cosas aquí, por ejemplo, hubo un error con tipos de cadenas no reflectivas, pero no tengo citas, solo ejemplos. –
Sorprendentemente, [Lo nuevo en .NET 4.0] (http://msdn.microsoft.com/en-us/library/ms171868.aspx) no tiene ninguna mención de este cambio en particular. –