这个stackoverflow问题提出了一个关于使用NaN值对双数组进行排序的有趣问题.OP发布了以下代码:
static void Main(string[] args)
{
double[] someArray = { 4.0, 2.0, double.NaN, 1.0, 5.0, 3.0, double.NaN, 10.0, 9.0, 8.0 };
foreach (double db in someArray)
{
Console.WriteLine(db);
}
Array.Sort(someArray);
Console.WriteLine("\n\n");
foreach (double db in someArray)
{
Console.WriteLine(db);
}
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
在.NET 3.5框架下运行时,数组按如下方式排序:
1,4,NaN,2,3,5,8,9,10,NaN
当您在.NET 4.0下运行它时,数组的逻辑排序更为一些:
NaN,NaN,1,2,3,4,5,8,9,10
我可以理解为什么它会在.NET 3.5中奇怪地排序(因为NaN不等于,小于或大于任何东西).我也可以理解为什么它会像在.NET 4.0中那样排序.我的问题是,为什么这个从3.5变为4.0?这个变化的Microsoft文档在哪里?
看一下这个 :
var a = Double.NaN;
Console.WriteLine(a == a);
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)
打印"假"
var a = Double.NaN;
Console.WriteLine(a.Equals(a));
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)
打印"真实"!
为什么打印"真实"?由于浮点数规范,NaN的值不等于它自己!所以似乎Equals()方法实现错误......我错过了什么?
我有一个通用GetMinimum方法。它接受 IComparable 类型的数组(因此它可能是string[]or double[])。在这种情况下double[],我如何实现此方法来忽略这些double.NaN值?(我正在寻找好的做法)
当我传递这个数组时
double[] inputArray = { double.NaN, double.NegativeInfinity, -2.3, 3 };
Run Code Online (Sandbox Code Playgroud)
它返回 double.NaN!
public T GetMinimum<T>(T[] array) where T : IComparable<T>
{
T result = array[0];
foreach (T item in array)
{
if (result.CompareTo(item) > 0)
{
result = item;
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud) 我的一位同事今天下午将这个问题悬空,让我感到好奇.我精通排序algos,但缺乏compsci/compeng的正式学位(我有点厌恶承认),不能真正指责这一点.:p
哦,是的,这在C#/ .NET实现的上下文中是温和的...以防万一改变了一些事情.
多谢你们.:)