-2

我使用了一个名为 PriorityQueue 的类,就像名字所说的那样,它应该比较元素并指定它们这是优先队列中的比较器类

private class DefaultComparer : IComparer
        {
            #region IComparer Members

            public int Compare(object x, object y)
            {
                #region Require

                if(!(y is IComparable))
                {
                    throw new ArgumentException(
                        "Item does not implement IComparable.");
                }

                #endregion

                IComparable a = x as IComparable;

                Debug.Assert(a != null);

                return a.CompareTo(y);
            }

            #endregion
        }

这就是我比较的

class Coordenada : IComparable
    {
        public int x;
        public int y;
        public float heuristico;

        int IComparable.CompareTo(object coord1)
        {
            Coordenada c1 = (Coordenada)coord1;
            //Coordenada c2 = (Coordenada)coord2;

            if(c1.heuristico < heuristico)
                return 1;
            if(c1.heuristico > heuristico)
                return -1;

            return 0;
        }
    }

正如我在标题中所说的错误是:无法从源类型转换为目标类型我知道 Coordenada 和对象不一样所以这就是为什么我尝试了转换并且它对我应该做什么没有任何想法?

编辑:这就是我如何使用应该在 Coordenada 中使用函数 CompareTo 的优先级队列

    Coordenada c;
    PriorityQueue cola = new PriorityQueue();

    c.x = ax;
    c.y = ay;
    c.heuristico = distancia;
    cola.Enqueue(c)

priorityQueue 是一个列表,我会在一段时间内将 2-3 个不同的 Coordenada 对象添加到该列表中,因为我会在每个周期中搜索最小的数字并将其从我的列表中删除,直到我到达我想要的位置

4

2 回答 2

1

改变你的CompareTo方法。它被接受object为参数,因此它应该能够处理其他不能处理的事情Coordenada。如果Coordenada要比较的对象不是同一类型,只需返回适当的值(可能是 -1、1、0,取决于您的逻辑)。你可以这样尝试:

int IComparable.CompareTo(object coord1)
{
    Coordenada c1 = coord1 as Coordenada;
    if (c1 == null)
        return -1;

    if(c1.heuristico < heuristico)
        return 1;
    if(c1.heuristico > heuristico)
        return -1;

    return 0;
}

如果你不比较性质完全不同的物体,那就更好了。

于 2012-07-31T21:43:59.660 回答
0

如果您确定coord1Coordenada类型,请使用显式强制转换为

Coordenada c1 = coord1 as Coordenada;

抛出一个InvaildCastExceptionif c1is null

于 2012-07-31T21:22:48.233 回答