Doğru, bu yüzden bir numaralandırılabilirim ve ondan farklı değerler almak istiyorum.
Kullanarak System.Linq
, elbette denilen bir uzantı yöntemi var Distinct
. Basit durumda, aşağıdaki gibi hiçbir parametre olmadan kullanılabilir:
var distinctValues = myStringList.Distinct();
İyi ve iyi, ama eşitliğini belirtmem gereken sayısız nesne varsa, mevcut tek aşırı yük:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
Eşitlik karşılaştırma argümanı bir örnek olmalıdır IEqualityComparer<T>
. Bunu elbette yapabilirim, ama biraz ayrıntılı ve cludgy.
Beklediğim bir lambda alacak bir aşırı yük olduğunu, bir Func <T, T, bool> deyin:
var distinctValues
= myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
Herkes böyle bir uzantı var mı, ya da eşdeğer bir geçici çözüm var mı? Yoksa bir şey mi kaçırıyorum?
Alternatif olarak, bir IEqualityComparer satır içi belirtmenin bir yolu var mı (beni uyandır)?
Güncelleme
Bir Anders Hejlsberg tarafından bir cevap buldum yazı bu konuda bir MSDN forumu. Diyor:
Karşılaşacağınız sorun, iki nesne eşit olduğunda, aynı GetHashCode dönüş değerine sahip olmalarıdır (veya başka bir deyişle, Distinct tarafından dahili olarak kullanılan karma tablosu düzgün çalışmaz). IEqualityComparer kullanıyoruz, çünkü Equals ve GetHashCode uyumlu uygulamaları tek bir arayüzde paketliyor.
Sanırım bu mantıklı ..