2010-03-20 17 views
5

Tôi đã đặt câu hỏi tại đây: When To Use IEquatable And Why về cách sử dụng IEquatable.Có ai biết điều gì sẽ xảy ra nếu bạn không thực hiện iequtalable khi sử dụng các bộ sưu tập chung?

Từ MSDN:

Các IEquatable (T) giao diện được sử dụng bởi bộ sưu tập chung các đối tượng như từ điển (TKey, TValue), Danh sách (T), và LinkedList (T) khi kiểm tra cho sự bình đẳng trong các phương pháp như vậy như Chứa, IndexOf, LastIndexOf và Loại bỏ.

Nếu bạn không triển khai giao diện đó, điều gì xảy ra chính xác? Ngoại lệ/đối tượng mặc định bằng/ref bằng?

Trả lời

2

Dưới đây là một ví dụ:

public class Foo : IEquatable<Foo> 
{ 
    public string Bar { get; set; } 

    public bool Equals(Foo other) 
    { 
     return string.Equals(other.Bar, Bar); 
    } 
} 

class Program 
{ 

    public static void Main(string[] args) 
    { 
     var foos = new List<Foo>(new[] 
     { 
      new Foo { Bar = "b1" }, 
      new Foo { Bar = "b2" }, 
      new Foo { Bar = "b3" }, 
     }); 

     var foo = new Foo { Bar = "b2" }; 
     Console.WriteLine(foos.IndexOf(foo)); // prints 1 
    } 
} 

Bây giờ bình luận việc thực hiện IEquatable<Foo> và chạy lại chương trình.

+1

Ngẫu nhiên rằng câu trả lời được chấp nhận không thực sự chứa câu trả lời ...;) – Guffa

+0

@Guffa, đôi khi một ví dụ đáng giá hơn nghìn từ. Xin đừng hiểu lầm tôi, tôi nghĩ rằng câu trả lời của bạn là tuyệt vời, nó giải thích rõ ràng lý thuyết về cách thức hoạt động của IE IEFatable . Nó chỉ là khi bạn đưa ra một ví dụ mọi người có thể chơi với họ có thể xem nó hoạt động như thế nào trong thực tế. –

+0

Có điểm đặc biệt nào để bỏ qua kết quả của ví dụ không? – Guffa

4

Nếu bạn không thực hiện so sánh bình đẳng, việc triển khai mặc định sẽ được sử dụng.

Nếu khóa là loại tham chiếu, việc so sánh tham chiếu được sử dụng. Trừ khi bạn giữ các đối tượng chính để bạn có thể sử dụng chúng khi truy xuất các mục từ bộ sưu tập, chúng sẽ bị mất. Tạo một đối tượng khóa mới từ cùng một dữ liệu cung cấp cho bạn một đối tượng với một tham chiếu khác biệt, vì vậy nó sẽ bỏ lỡ mục bạn đang tìm kiếm.

1

Hơi sai khi nói rằng Dictionary<TKey,TValue> sử dụng IEquatable<T> để so sánh giá trị TKey. Nó thực sự sử dụng một số IEquatilyComparer<T> để so sánh các giá trị.

Khi không được cung cấp rõ ràng mặc dù nó sẽ sử dụng EqualityComparer<TKey>.Default để tạo trình so sánh. Thuộc tính tĩnh này có một heuristic để xác định đó là cách tốt nhất để so sánh các giá trị TKey. Nếu loại TKey thực hiện IEqutable<TKey>, điều này sẽ được sử dụng. Nếu nó không mặc dù nó sẽ rơi trở lại bằng cách sử dụng phương thức .Equals trực tiếp.

Vì vậy, nếu bạn không triển khai IEquatable<T> và không cung cấp tính năng khám phá IEqualityComparer<T> thì Dictionary<TKey,TValue> sẽ dựa vào bình thường .Equals.

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