Phải, vì vậy tôi có một số lượng lớn và mong muốn nhận được các giá trị khác biệt từ nó.
Sử dụng System.Linq
, tất nhiên có một phương pháp mở rộng được gọi là Distinct
. Trong trường hợp đơn giản, nó có thể được sử dụng mà không có tham số, như:
var distinctValues = myStringList.Distinct();
Tốt và tốt, nhưng nếu tôi có vô số đối tượng mà tôi cần chỉ định bình đẳng, thì quá tải có sẵn duy nhất là:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
Đối số so sánh bằng phải là một thể hiện của IEqualityComparer<T>
. Tôi có thể làm điều này, tất nhiên, nhưng nó hơi dài dòng và, tốt, vụng về.
Những gì tôi mong đợi là một sự quá tải sẽ mất một lambda, giả sử Func <T, T, bool>:
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
Bất cứ ai cũng biết nếu một số phần mở rộng như vậy tồn tại, hoặc một số cách giải quyết tương đương? Hay tôi đang thiếu một cái gì đó?
Ngoài ra, có cách nào để chỉ định nội tuyến IEqualityComparer (embarass me) không?
Cập nhật
Tôi tìm thấy một câu trả lời của Anders Hejlsberg cho một bài đăng trên một diễn đàn MSDN về chủ đề này. Anh ta nói:
Vấn đề bạn sẽ gặp phải là khi hai đối tượng so sánh bằng nhau, chúng phải có cùng giá trị trả về GetHashCode (hoặc nếu không, bảng băm được sử dụng bên trong bởi Distinc sẽ không hoạt động chính xác). Chúng tôi sử dụng IEqualityComparer vì nó gói các triển khai tương đương của Equals và GetHashCode vào một giao diện duy nhất.
Tôi cho rằng nó có ý nghĩa..