首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IComparer问题

IComparer问题
EN

Stack Overflow用户
提问于 2013-05-08 07:46:41
回答 2查看 3K关注 0票数 5

我有个奇怪的问题,我不知道原因。我将设法清楚地描述我的问题。

我有一个RTree类,在这个类中,我想比较两个rectanlge (在这里我称之为信封,它包含minX、minY、maxX、maxY),因此我们有一个比较类如下:

代码语言:javascript
复制
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()方法返回不一致的结果。一个值不等于它自己,或者一个值重复地与另一个值相比较会产生不同的结果。

代码语言:javascript
复制
sortedChildBoundables.Sort(new AnonymousXComparerImpl());

,这是奇怪的部分。此错误仅发生在没有安装.net的VistualStudio 4.0中。如果机器安装了VS或.net 4.5,则此问题无法再次重新处理.

在这种情况下,我不知道为什么会发生这种情况。如果你对这类问题有任何经验的话,那就太好了。

谢谢,霍华德

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-08 08:47:56

如果ea.MinXNaNa将是NaNa > ba < b都将是false。这意味着,有些对象与其他所有对象相比都是相等的。

首先,您必须决定如何对包含NaN的对象进行排序。

一个简单的解决方法可能是插入

代码语言:javascript
复制
if (double.IsNaN(a)) a = 0.0;
if (double.IsNaN(b)) b = 0.0;

正如@Seph和@Jeppe在注释中所指出的,double.CompareTo做了正确的事情,所以最后一行可以被return a.CompareTo(b);替换。

票数 5
EN

Stack Overflow用户

发布于 2016-01-21 08:27:03

一个可能的原因是您的信息实际上在比较期间发生了变化。

如果您在后台线程中进行排序,那么如果比较两次请求同一项的不同值,您肯定会得到这个错误。

例如,如果您的主线程更新其中一个值(可能通过数据绑定),则比较运行。

请确保缓存比较的值,以便始终返回一致的结果。或者接受错误可能不时发生的事实,并在错误发生时重新进行排序。

这也将解释您对机器/操作系统依赖的感觉。根据软件和硬件的不同,多线程问题的发生也不同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16435309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档