-2

PriorityQueueという名前のクラスを使用しています。名前のように、要素を比較してそれらを指定する必要があります。これは、優先度キュー内のComparerクラスです。

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 に答える