2013-08-06 9 views
6

Mam obiekt o nazwie Shape, który zawiera pole public int[,] coordinate { get; set; }.IComparable in C#

Mam oddzielną klasę, która ma kolekcję obiektów Shape. W konkretnym punkcie, życzę, by sprawdzić:

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

Więc w klasie Shape Dodałem odniesienia IComparable i dodaje metodę CompareTo:

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

Ja jednak otrzymuję błąd:

Cannot implicitly convert type 'bool' to 'int' 

Jak zatem sformułować zwrot tak, aby zwracał int, a nie bool, tak jak obecnie?

UPDATE

Gdybym zmienić kod powrotny do:

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

otrzymuję następujący mesage błąd:

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

Nowy komunikat o błędzie jest dość proste do rozwiązania, zmień ** public int CompareTo (Shape other) ** na ** public int CompareTo (object other) **, ale wtedy napotkasz problemy z odlewaniem i CompareTo nie istnieje dla tablic wielowymiarowych. –

Odpowiedz

3

IComparable oznacza, że ​​dwa obiekty można porównać w pewnym sensie, że można stwierdzić, który obiekt ma "wyższą wartość". Jest zwykle używany do celów sortowania. Zamiast tego należy zastąpić metodę Equals. Powinieneś także użyć Point struct zamiast array.

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

Ach, oczywiście. Bardzo dziękuję za wyjaśnienie! – Subby

+0

@Subby @Nikita Te implementacje 'Equals' i' GetHashCode' wydają się błędne. Twoje współrzędne są tablicą wielowymiarową i prawdopodobnie nie chcesz oprzeć swojej równości na 'ReferenceEquals'. –

+0

@ ErenErsönmez, w moim przykładzie nie ma tablicy wielowymiarowej. Wydawało mi się, że OP używał go do prostego ustawienia współrzędnych x i y pojedynczego punktu, więc zastąpiłem go strukturą "Point". Nie widzę też problemu z używaniem 'ReferenceEquals'. Czy coś mi brakuje? –

2

do wykonywania Zawiera sprawdzić trzeba zastąpić Równa operatora w klasie Shape.

3

Skoro chcesz tylko sprawdzić dla równości wdrożyć IEquatable interfejs nieIComparable. IComparable służy za cel

sortowania
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 

} 

UWAGA

IEquatable powinny być realizowane dla dowolnego obiektu, które mogą być przechowywane w generic kolekcji inny trzeba by też zastąpić obiektu Equals method.Also jak wskazano w innych ans użyć struktury zamiast wielowymiarowej tablicy