5 votes

Numéro d'IComparer

J'ai un problème étrange et je n'ai pas d'indice pour en trouver la raison. Je vais essayer de décrire clairement mon problème.

J'ai une classe RTree, dans cette classe, je veux comparer deux rectangles (ici j'ai appelé enveloppe, elle contient minX, minY, maxX, maxY), donc nous avons une classe de comparaison comme suit :

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;
    }
}

Avec ce comparateur, nous pouvons maintenir une ArrayList d'enveloppe et la trier facilement, les enveloppes sont ajoutées aléatoirement. Lorsque nous appelons le code suivant et que nous rencontrons l'icône

Impossible de trier car la méthode IComparer.Compare() renvoie des résultats des résultats incohérents. Soit une valeur n'est pas égale à elle-même lors de la comparaison, soit une valeur comparée à plusieurs reprises à une autre donne des résultats différents. résultats différents.

sortedChildBoundables.Sort(new AnonymousXComparerImpl());

Voilà ce qui est bizarre. Cette erreur ne se produit que dans .net 4.0 qui n'installe pas le VistualStudio. Si la machine a installé le VS ou le .net 4.5, ce problème ne peut plus se reproduire.

Dans ce cas, je n'arrive pas à comprendre pourquoi cela se produit. Si vous avez de l'expérience dans le débogage de ce genre de problème, je vous en serais reconnaissant.

Merci, Howard

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X