2013-08-06 5 views
6

У меня есть объект под названием Shape, который содержит поле public int[,] coordinate { get; set; }.IComparable in C#

У меня есть отдельный класс, который содержит коллекцию 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' 

Как мне поэтому фраза return так, чтобы она возвращала int, а не bool, как это делается на данный момент?

UPDATE

Если изменить код возврата к:

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

Я получаю следующее электронного письма об ошибке:

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

Новое сообщение об ошибке просто изменить, изменить ** public int CompareTo (Shape other) ** to ** public int CompareTo (object other) **, но тогда вы столкнетесь с проблемами кастинга, а CompareTo не существует для многомерных массивов. –

ответ

3

IComparable подразумевает, что два объекта можно сравнить в определенном смысле, что вы можете сказать, какой объект имеет «более высокое значение». Он обычно используется для сортировки. Вместо этого вы должны переопределить метод Equals. Вы также должны использовать Point struct вместо массива.

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

Ах, конечно. Большое спасибо за объяснение! – Subby

+0

@Subby @Nikita. Реализации 'Equals' и' GetHashCode' кажутся неправильными. Ваши координаты являются многогранным массивом, и вы, вероятно, не хотите основывать свое равенство на «ReferenceEquals». –

+0

@ ErenErsönmez, в моем примере нет многомерного массива. Мне показалось, что OP использовал его, чтобы просто установить координату x и y одной точки, поэтому я заменил ее на 'Point' struct. Я также не вижу проблемы с использованием 'ReferenceEquals'. Я что-то упускаю? –

2

Для выполнения Содержит проверки необходимо переопределить Equals оператора в классе Shape.

3

Поскольку вы только хотите проверить равенство реализовать IEquatable интерфейс не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 

} 

ПРИМЕЧАНИЕ

IEquatable должны быть реализованы для любого объекта, который может храниться в generic коллекции еще вы должны переопределить Объект Equals method.Also как указано в другом использовании ans Point struct вместо многомерного массива

 Смежные вопросы

  • Нет связанных вопросов^_^