2013-08-06 21 views
6

Ich habe ein Objekt namens Shape, das ein Feld public int[,] coordinate { get; set; } enthält.IComparable in C#

Ich habe eine separate Klasse, die eine Sammlung von Shape Objekte hat. An einem bestimmten Punkt möchte ich überprüfen:

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

So in der Shape Klasse habe ich hinzugefügt, um die IComparable Referenz und eingefügt, um die CompareTo Methode:

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

ich aber eine Störung erhalte:

Cannot implicitly convert type 'bool' to 'int' 

Wie schreibe ich daher die Rückkehr, so dass es ein int zurückgibt und nicht ein bool, wie es im Moment so ist?

UPDATE

Wenn ich den Return-Code zu ändern:

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

bekomme ich folgende Fehler mesage:

Error 1 'ShapeD.Game_Objects.Shape' does not implement interface member 'System.IComparable.CompareTo(ShapeD.Game_Objects.Shape)'. 'ShapeD.Game_Objects.Shape.CompareTo(ShapeD.Game_Objects.Shape)' cannot implement 'System.IComparable.CompareTo(ShapeD.Game_Objects.Shape)' because it does not have the matching return type of 'int'. C:\Users\Usmaan\Documents\Visual Studio 2012\Projects\ShapeD\ShapeD\ShapeD\Game Objects\Shape.cs 10 18 ShapeD

+0

Die neue Fehlermeldung ist fair einfach zu lösen, ändern Sie ** public int CompareTo (andere Form) ** zu ** public int CompareTo (Objekt andere) **, aber dann werden Sie Casting-Probleme auftreten und CompareTo existiert nicht für multidimensionale Arrays. –

Antwort

3

IComparable bedeutet, dass zwei Objekte in einem Sinne verglichen werden können, dass Sie erkennen können, welches Objekt "höheren Wert" hat. Es wird im Allgemeinen für Sortierzwecke verwendet. Sie sollten stattdessen die Methode Equals überschreiben. Sie sollten auch Point struct anstelle von array verwenden.

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.X^coordinate.Y; 
    } 
} 
+0

Ah natürlich. Vielen Dank für die Erklärung! – Subby

+0

@Subby @Nikita Diese 'Equals' und' GetHashCode' Implementierungen scheinen falsch zu sein. Ihre Koordinaten sind ein multidimensionales Array, und Sie möchten Ihre Gleichheit wahrscheinlich nicht auf 'ReferenceEquals' gründen. –

+0

@ ErenErsönmez, gibt es kein multidimensionales Array in meinem Beispiel. Es schien mir, dass OP es verwendete, um einfach die x- und y-Koordinate eines einzelnen Punktes zu setzen, also ersetzte ich es durch "Punkt" struct. Ich sehe auch kein Problem mit 'ReferenceEquals'. Fehle ich etwas? –

2

für die Durchführung enthält, die Sie außer Kraft setzen überprüfen müssen Gleichheitsoperator in der Formklasse.

3

Da Sie nur für die Gleichstellung überprüfen möchten nichtIComparableIEquatable-Schnittstelle implementieren. IComparable zum Sortieren Zweck für jedes Objekt implementiert werden, die sonst in einer generic Sammlung gespeichert werden könnten

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 

} 

HINWEIS

IEquatable sollten Sie würden auch Objekt außer Kraft setzen Equals method.Also

verwendet wie in anderen ans gezeigt, Point struct statt multidimensional Array