2010-03-19 23 views
10

Tôi có một lớp học triển khai IComparable.C# - Làm thế nào để thực hiện nhiều so sánh cho một lớp học <T> IComparable?

public class MyClass : IComparable<MyClass> 
{ 
    public int CompareTo(MyClass c) 
    { 
     return this.whatever.CompareTo(c.whatever); 
    } 

    etc.. 
} 

Sau đó tôi có thể gọi phương thức sắp xếp của một danh sách chung của lớp học của tôi

List<MyClass> c = new List<MyClass>(); 
//Add stuff, etc. 

c.Sort(); 

và có trong danh sách được sắp xếp theo Comparer của tôi.

Làm cách nào để chỉ định các bộ so sánh khác để sắp xếp các bộ sưu tập theo các cách khác của MyClass để cho phép người dùng sắp xếp bộ sưu tập của tôi theo nhiều cách khác nhau?

Trả lời

13

Để thiết lập các loại trong lớp học của bạn:

public static Comparison<MyClass> OtherComparison = delegate(MyClass object1, MyClass object2) 
{ 
    return object1.Whatever.CompareTo(object2.Whatever); 
}; 

Sau đó, để sắp xếp sử dụng so sánh mới của bạn:

List<MyClass> myClassList = new List<MyClass>(); 
myClassList.Sort(MyClass.OtherComparison); 

Trừ bạn rõ ràng sẽ không muốn sắp xếp một danh sách trống :)

+0

+1 mặc dù bạn có thể viết gọn gàng hơn với biểu thức lambda :) –

+0

Thật tuyệt vời, cảm ơn. –

+0

Kevin, tôi đã vật lộn với điều này trong 2 ngày nay, và tôi không thể hiểu nó đang làm gì. Cách của bạn không hoạt động, nhưng phương thức tĩnh này sẽ được viết như thế nào mà không cần viết nó như là 'delegate'? – jp2code

9

Bạn có thể gọi Sắp xếp với một đối sánh cụ thể làm đối số. Tham khảo: MSDN

+0

Tôi upvoted câu trả lời này là của Kevin bởi vì tôi nghĩ rằng họ là cả hai giải pháp tốt. Tôi đã sử dụng giải pháp này vì tôi nghĩ nó đơn giản hơn. itemDescription/ItemNumber: Tôi đã cung cấp câu trả lời thể hiện việc triển khai của tôi –

2

Nếu bạn có nhiều cách để sắp xếp danh sách đối tượng của mình, bạn rõ ràng phải chỉ định tùy chọn nào để chọn. Đó là những gì các phần ghi đè khác của Sắp xếp là tốt cho. Có một cái nhìn tại IComparer và so sánh.

3

Một bước theo hướng đó sẽ là sử dụng quá tải sắp xếp cho phép bạn chỉ định IComparer<T> (không phải là IComparable<T>, mặc dù).

Nếu bạn đã có rất nhiều triển khai IComparable<T>, sẽ không quan trọng để viết thực hiện mục đích chung là IComparer<T> so sánh hai trường hợp IComparable<T>. Trong thực tế, tôi hơi ngạc nhiên khi một lớp như vậy đã không tồn tại trong BCL, nhưng tôi đã không thể tìm thấy nó.

Comparer<T>.Default đến gần, nhưng không hoàn toàn.

Các vấn đề liên quan