2013-08-06 39 views
6

Tôi có một đối tượng được gọi là Shape có chứa trường public int[,] coordinate { get; set; }.IComparable in C#

Tôi có một lớp riêng biệt có bộ sưu tập gồm Shape đối tượng. Tại một điểm cụ thể, tôi muốn kiểm tra:

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

Vì vậy, trong lớp Shape Tôi đã thêm IComparable tham khảo và chèn CompareTo phương pháp:

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

Tuy nhiên tôi nhận được một lỗi:

Cannot implicitly convert type 'bool' to 'int' 

Làm cách nào để tôi trả về cụm từ trả về để trả về int và không phải là bool khi đang thực hiện tại thời điểm này?

CẬP NHẬT

Nếu tôi thay đổi mã trở lại:

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

tôi nhận được các mesage lỗi sau:

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

Thông báo lỗi mới là khá đơn giản để giải quyết, thay đổi ** công khai CompareToTo (hình khác) ** to ** công khai CompareTo (đối tượng khác) ** nhưng sau đó bạn sẽ phải đối mặt với vấn đề đúc và CompareTo không tồn tại cho mảng đa dimentional. –

Trả lời

3

ngụ ý IComparable, hai đối tượng có thể được so sánh theo nghĩa, bạn có thể biết đối tượng nào có "giá trị cao hơn". Nó thường được sử dụng cho mục đích phân loại. Bạn nên ghi đè lên phương thức Equals. Bạn cũng nên sử dụng cấu trúc điểm thay cho mảng.

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 tất nhiên. Cảm ơn bạn rất nhiều vì đã giải thích! – Subby

+0

@Subby @Nikita Những triển khai 'Equals' và' GetHashCode' này có vẻ sai. Tọa độ của bạn là một mảng đa chiều, và bạn có thể không muốn căn cứ sự bình đẳng của bạn trên 'ReferenceEquals'. –

+0

@ ErenErsönmez, không có mảng đa chiều trong ví dụ của tôi. Dường như với tôi rằng OP đã sử dụng nó để chỉ đơn giản là thiết lập x và y phối hợp của điểm duy nhất, vì vậy tôi thay thế nó bằng 'Point' struct. Tôi cũng không thấy một vấn đề với việc sử dụng 'ReferenceEquals'. Tui bỏ lỡ điều gì vậy? –

2

Đối với biểu diễn Có kiểm tra xem bạn cần phải ghi đè Equals điều hành trong lớp Shape.

3

Vì bạn chỉ muốn kiểm tra cho sự bình đẳng thực hiện IEquatable giao diện khôngIComparable. IComparable được sử dụng để phân loại mục đích

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 

} 

LƯU Ý

IEquatable cần được thực hiện đối với bất kỳ đối tượng nào có thể được lưu trữ trong một bộ sưu tập generickhác bạn sẽ phải cũng để ghi đè Object của Equals method.Also như được chỉ ra trong các ans khác sử dụng Point struct thay vì mảng đa chiều