7

Shapeフィールドを含むというオブジェクトがありpublic int[,] coordinate { get; set; }ます。

オブジェクトのコレクションを持つ別のクラスがありShapeます。特定の時点で、次のことを確認したいと思います。

if(shapes.Contains(shape))
{
   // DoSomething
}

したがって、Shapeクラスに参照を追加し、メソッドIComparableを挿入しました。CompareTo

public int CompareTo(Shape other)
{
    return this.coordinate.Equals(other.coordinate);
}

ただし、エラーが発生します:

Cannot implicitly convert type 'bool' to 'int'

したがって、現時点ではboolではなくintを返すように、returnをどのように表現すればよいでしょうか。

アップデート

戻りコードを次のように変更した場合:

return this.coordinate.CompareTo(other.coordinate);

次のエラー メッセージが表示されます。

エラー 1 「ShapeD.Game_Objects.Shape」はインターフェイス メンバー「System.IComparable.CompareTo(ShapeD.Game_Objects.Shape)」を実装していません。'ShapeD.Game_Objects.Shape.CompareTo(ShapeD.Game_Objects.Shape)' は 'System.IComparable.CompareTo(ShapeD.Game_Objects.Shape)' を実装できません。'int' の一致する戻り値の型がないためです。C:\Users\Usmaan\Documents\Visual Studio 2012\Projects\ShapeD\ShapeD\ShapeD\Game Objects\Shape.cs 10 18 ShapeD

4

4 に答える 4

2

等価性を確認したいだけなので、IEquatableインターフェイスnot IComparableを実装します。 IComparableソート目的で使用されます

public bool Equals(Shape s)
{

    int count=0;
    int[] temp1=new int[this.coordinate.Length];
    foreach(int x in this.coordinate)temp1[count++]=x;//convert to single dimention

    count=0;
    int[] temp2=new int[s.coordinate.Length];
    foreach(int x in s.coordinate)temp2[count++]=x;//convert to single dimention

    return temp1.SequenceEqual(temp2);//check if they are equal

}

ノート

IEquatablegenericコレクションに格納される可能性のあるオブジェクトに対して実装する必要があります。それ以外の場合は、オブジェクトのメソッドもオーバーライドする必要があります。またEquals、他の ans で指摘されているように、多次元配列の代わりにPoint構造体を使用します。

于 2013-08-06T06:06:00.227 に答える
2

IComparable は、ある意味で 2 つのオブジェクトを比較できることを意味し、どちらのオブジェクトが「より高い値」を持っているかを知ることができます。これは、通常、ソートの目的で使用されます。代わりにメソッドをオーバーライドする必要がありますEquals。また、配列の代わりに Point 構造体を使用する必要があります。

class Shape : IEquatable<Shape>
{
    public Point coordinate { get; set; }

    public bool Equals(Shape other)
    {
        if (other == null) return false;
        return coordinate.Equals(other.coordinate);
    }

    public override bool Equals(object other)
    {
        if (other == null) return false;
        if (ReferenceEquals(this, other)) return true;
        var shape = other as Shape;
        return Equals(shape);
    }

    public override int GetHashCode()
    {
        return coordinate.GetHashCode()
    }
}
于 2013-08-06T06:02:59.527 に答える
1

含むチェックを実行するには、Shape クラスで Equals 演算子をオーバーライドする必要があります。

于 2013-08-06T05:52:27.280 に答える