2011-10-13 35 views
6

phương thức 'Bình đẳng' và 'GetHashcode' tồn tại trong lớp đối tượng và loại của chúng ta kế thừa lớp cơ sở đối tượng. khác nhau giữa việc thực hiện hai phương pháp của đối tượng trực tiếp và sử dụng giao diện IComparer là gì?Tại sao chúng ta cần IEqualityComparer, giao diện IEqualityComparer <T>?

nếu chúng tôi ghi đè lên bình đẳng và GetHashCode của đối tượng và đẩy đến một hàm có thể bắt đầu bằng, nó sẽ sử dụng phương thức bằng nhau của phương pháp ghi đè?

điểm khác biệt của một hashtable mới với hàm tạo IEqualityComparer là gì?

Trả lời

14

Giao diện IComparable được sử dụng khi bạn cần để có thể "loại" đối tượng, và nó mang lại cho bạn một phương pháp (CompareTo) cho bạn biết nếu hai đối tượng đều <, = hay>. Hàm tạo sử dụng IEqualityComparer cho phép bạn cung cấp một số Equals/GetHashCode cụ thể có thể khác với các đối tượng được xác định bởi đối tượng của bạn. Thông thường, Hashtable sẽ sử dụng đối tượng của bạn bị ghi đè EqualsGetHashCode (hoặc số cơ sở objectEqualsGetHashCode). Để làm ví dụ, chuỗi chuẩn so sánh theo cách nhạy cảm ("A"! = "a"), nhưng bạn có thể tạo lớp trợ giúp IEqualityComparer để có thể băm chuỗi của bạn theo cách không phân biệt chữ hoa chữ thường. (Kỹ thuật lớp này đã có mặt trong nhiều biến thể: chúng được gọi là StringComparer.InvariantCultureIgnoreCase và tất cả các phương pháp tĩnh khác StringComparer mà trả về một đối tượng StringComparer mà thực hiện các IComparer, IEqualityComparer, IComparer<string>, IEqualityComparer<string>)

Là một lưu ý, Hashtable sử dụng một tham số tùy chọn IEqualityComparer, không phải là phiên bản chung IEqualityComparer<T>, bởi vì Hashtable là tiền chất.

1

giao diện IComparer (cả giao diện chung và không chung) cho phép bạn so sánh hai trường hợp với nhau.

Phương pháp Compare cho phép bạn so sánh chính đối tượng với một phiên bản khác. Offcourse, khi dụ hiện tại là null, bạn sẽ nhận được một NullReferenceException trong trường hợp này, vì bạn gọi Compare trên một thể hiện 'null'. Một lớp thực hiện IComparer có thể khắc phục sự cố này.

Vì vậy, khi bạn thực hiện giao diện IComparer, bạn sẽ có một lớp học trong đó có một phương pháp 'So sánh', có thể được gọi là như thế này:

public class MyObjectComparer : IComparer<MyObject> 
{ 
    public int Compare(MyObject first, MyObject second) 
    { 
     // implement logic here to determine whether first is less, greater or equal then second. 
    } 
} 

này cho phép bạn làm điều này:

var c = new MyObjectComparer(); 
var one = new MyObject(); 
var two = new MyObject(); 
c.Compare (one, two); 

Khi bạn khởi tạo một Hashtable với các nhà xây dựng, nơi bạn chỉ định các trường hợp IEqualityComparer, điều này có nghĩa rằng cho IEqualityComparer sẽ được sử dụng để xác định xem một phím nào đó là đã có trong Hashtable.
Nếu không, phương pháp So sánh của đối tượng khóa sẽ được sử dụng.

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