2010-05-07 17 views
7

tabanlı bir listeden nesne alma Linq'deki Karşılaştırma yöntemi, bir IEqualityComparer ile bulmanızı sağlar, ancak bir öğeyi aynı karşılaştırıcıyla almanıza olanak tanıyan bir karşı taraf yöntemi bulamıyorum.IEqualityComparer <T>

Gerçekten bunu yapmanın en iyi yolu bu mu?

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

(Linq yöntemine hariç çağrısı ile IEqualityComaprer kullanımını paylaşıyorum ve ben eşitlik karşılaştırmalar için tek bir kaynak oluşturmayı istedik)

Düzenleme: Bakıyorum ne

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

EDIT2: imzaya sahip bir yöntem için bunun korkak var bu işe yarıyor. ama bu korkunç ve :(

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

Öğe bulunamazsa hangi davranışı beklersiniz? – R0MANARMY

+0

@ R0MANARMY: Benim için gerçekten önemli değil, ya geri dönüş ya da atma iyi olurdu. – Greg

+0

Bu soruyla da ilgilenebilirsiniz ('Single' kullanma ve' First 'kullanma arasındaki fark) http://stackoverflow.com/questions/2724096/linq-single-vs-first – R0MANARMY

cevap

5

İlk olarak, oldukça (belki o a tek yapım düşünmelisiniz) her seferinde yeni bir örneğini oluşturmak yerine MyEqualityComparer aynı örneğini kullanmalıdır kullanmak asla.

.

public static T Single<T>(this IEnumerable<T> source, IEqualityComparer<T> comparer, T value) 
{ 
    return source.Single(item => comparer.Equals(item, value)); 
} 
: o, bunu yapmanın çok daha iyi bir yolu var sanmıyorum bunu daha kısa ve daha okunabilir olmak için, bir yüklem yerine IEquaityComparer<T> alır bir uzantısı yöntemi oluşturabilirsiniz dışında

+0

Her şey bana daha temiz bir çözüm getirecek iyi tavsiyeler. Son cevabın "mevcut değil, kendi haline getir" olduğunu düşünüyorum. – Greg

İlgili konular