我有个奇怪的问题,我不知道原因。我将设法清楚地描述我的问题。
我有一个RTree类,在这个类中,我想比较两个rectanlge (在这里我称之为信封,它包含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());,这是奇怪的部分。此错误仅发生在没有安装.net的VistualStudio 4.0中。如果机器安装了VS或.net 4.5,则此问题无法再次重新处理.
在这种情况下,我不知道为什么会发生这种情况。如果你对这类问题有任何经验的话,那就太好了。
谢谢,霍华德
发布于 2013-05-08 08:47:56
如果ea.MinX是NaN,a将是NaN,a > b和a < b都将是false。这意味着,有些对象与其他所有对象相比都是相等的。
首先,您必须决定如何对包含NaN的对象进行排序。
一个简单的解决方法可能是插入
if (double.IsNaN(a)) a = 0.0;
if (double.IsNaN(b)) b = 0.0;正如@Seph和@Jeppe在注释中所指出的,double.CompareTo做了正确的事情,所以最后一行可以被return a.CompareTo(b);替换。
发布于 2016-01-21 08:27:03
一个可能的原因是您的信息实际上在比较期间发生了变化。
如果您在后台线程中进行排序,那么如果比较两次请求同一项的不同值,您肯定会得到这个错误。
例如,如果您的主线程更新其中一个值(可能通过数据绑定),则比较运行。
请确保缓存比较的值,以便始终返回一致的结果。或者接受错误可能不时发生的事实,并在错误发生时重新进行排序。
这也将解释您对机器/操作系统依赖的感觉。根据软件和硬件的不同,多线程问题的发生也不同。
https://stackoverflow.com/questions/16435309
复制相似问题