【发布时间】:2013-05-08 07:46:41
【问题描述】:
我有一个奇怪的问题,我不知道原因。我会尽量清楚地描述我的问题。
我有一个 RTree 类,在这个类中,我想比较两个矩形(这里我称为信封,它包含 minX、minY、maxX、maxY),所以我们有一个比较器类如下:
private class AnonymousXComparerImpl : IComparer
{
public AnonymousXComparerImpl()
{ }
public int Compare(object o1, object o2)
{
IEnvelope ea = (IEnvelope)((IBoundable)o1).Bounds;
IEnvelope eb = (IEnvelope)((IBoundable)o2).Bounds;
double a = (ea.MinX + ea.MaxX) / 2d;
double b = (eb.MinX + eb.MaxX) / 2d;
return a > b ? 1 : a < b ? -1 : 0;
}
}
使用这个比较器,我们可以维护一个信封的ArrayList并轻松对其进行排序,信封是随机添加的。当我们调用下面的代码,我们遇到了
无法排序,因为 IComparer.Compare() 方法返回 结果不一致。要么一个值不等于它自己, 或一个值与另一个值重复比较会产生不同的 结果。
sortedChildBoundables.Sort(new AnonymousXComparerImpl());
这是奇怪的部分。此错误仅发生在未安装 VisualStudio 的 .net 4.0 中。如果机器安装了VS或者.net 4.5,这个问题就不能再出现了。
在这种情况下,我无法弄清楚为什么会发生这种情况。如果您对调试此类问题有任何经验,那就太好了,我很感激。
谢谢, 霍华德
【问题讨论】:
-
我在这里唯一能想到的是浮点问题,这意味着相同项目的相等性并不完全匹配,不知道为什么它特定于 v4。您是否尝试过强制舍入?
-
尝试使用
decimal数据类型而不是双精度 -
没有其他线程涉及吗?另外,这个线程可能很有趣:stackoverflow.com/questions/6683059/…
-
MinX、MaxX 值可以是 NaN 吗?
-
您是否尝试过只使用
return a.CompareTo(b);来代替?您的问题可能是 NaN != NaN。