2010-05-07 27 views
7

Phương pháp so sánh trong LINQ cho phép bạn tìm bằng IEqualityComparer, nhưng tôi không thể tìm thấy phương thức đối tác cho phép bạn truy xuất một mục bằng cùng một trình so sánh.Cách lấy đối tượng từ danh sách dựa trên IEqualityComparer <T>

Đây có phải là cách tốt nhất để làm điều đó không?

MyItem myFinderItem = new MyItem(keyField1, keyField2); 
if (myList.Contains(myFinderItem, new MyEqualityComparer())) 
{ 
    MyItem myRealItem = myList.Single(item => new MyEqualityComparer().Equals(item , myFinderItem)); 
} 

(Tôi đang chia sẻ việc sử dụng các IEqualityComaprer với một cuộc gọi đến Trừ phương pháp LINQ và tôi muốn duy trì một nguồn duy nhất để so sánh bình đẳng)

Edit: Những gì tôi đang tìm kiếm cho một phương pháp có chữ ký:

T Find<T>(T t, IEqualityComparer<T> comparer) 

Edit2: tôi đoán việc này, nó sôi nổi . nhưng nó kinh khủng và sẽ không bao giờ sử dụng nó :(

myList.Intersect(new List<MyItem>{myFinderItem}, comparer).Single(); 
+0

Bạn mong đợi hành vi nào nếu phần tử không được tìm thấy? – R0MANARMY

+0

@ R0MANARMY: Không thực sự quan trọng với tôi, hoặc trả lại null hoặc ném sẽ là tốt. – Greg

+0

Bạn cũng có thể quan tâm đến câu hỏi này (sự khác biệt giữa việc sử dụng 'Single' và sử dụng' Đầu tiên') http://stackoverflow.com/questions/2724096/linq-single-vs-first – R0MANARMY

Trả lời

5

Trước tiên, bạn nên sử dụng cùng một ví dụ của MyEqualityComparer thay vì tạo ra một trường hợp mới mỗi lần (bạn có lẽ nên xem xét làm cho nó một singleton).

khác hơn thế, tôi không nghĩ rằng có một cách tốt hơn để làm việc đó Nếu bạn muốn làm cho nó ngắn hơn và dễ đọc hơn, bạn có thể tạo ra một phương pháp mở rộng mà phải mất một IEquaityComparer<T> thay vì một vị:.

public static T Single<T>(this IEnumerable<T> source, IEqualityComparer<T> comparer, T value) 
{ 
    return source.Single(item => comparer.Equals(item, value)); 
} 
+0

Tất cả xung quanh lời khuyên tốt mà đưa tôi đến một giải pháp sạch hơn. Tôi đoán câu trả lời cuối cùng là "nó không tồn tại, làm của riêng bạn". – Greg

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