Sadece DistinctBy
işlevselliği elde etmek için projenize MoreLinq kütüphanesini eklemek istemiyorsanız, o zaman Linq'in argümanını Distinct
alan yöntemin aşırı yüklenmesini kullanarak aynı sonucu elde edebilirsiniz IEqualityComparer
.
Genel bir sınıfın iki örneğinin özel karşılaştırmasını gerçekleştirmek için lambda sözdizimini kullanan genel bir özel eşitlik karşılaştırma sınıfı oluşturarak başlarsınız:
public class CustomEqualityComparer<T> : IEqualityComparer<T>
{
Func<T, T, bool> _comparison;
Func<T, int> _hashCodeFactory;
public CustomEqualityComparer(Func<T, T, bool> comparison, Func<T, int> hashCodeFactory)
{
_comparison = comparison;
_hashCodeFactory = hashCodeFactory;
}
public bool Equals(T x, T y)
{
return _comparison(x, y);
}
public int GetHashCode(T obj)
{
return _hashCodeFactory(obj);
}
}
Daha sonra ana kodunuzda şu şekilde kullanırsınız:
Func<Person, Person, bool> areEqual = (p1, p2) => int.Equals(p1.Id, p2.Id);
Func<Person, int> getHashCode = (p) => p.Id.GetHashCode();
var query = people.Distinct(new CustomEqualityComparer<Person>(areEqual, getHashCode));
İşte bu kadar! :)
Yukarıdakiler aşağıdakileri varsayar:
- Emlak
Person.Id
türüint
people
Toplama, boş öğeler içermiyor
Koleksiyon null içeriyorsa, null olup olmadığını kontrol etmek için lambdasları yeniden yazın, örn:
Func<Person, Person, bool> areEqual = (p1, p2) =>
{
return (p1 != null && p2 != null) ? int.Equals(p1.Id, p2.Id) : false;
};
DÜZENLE
Bu yaklaşım Vladimir Nesterovsky'nin cevabındakine benzer ancak daha basittir.
Ayrıca Joel'in cevabındaki ile benzerdir, ancak birden fazla özelliği içeren karmaşık karşılaştırma mantığına izin verir.
Nesnelerinizin sadece hiç farklılık gösterebilir Ancak, Id
daha sonra başka bir kullanıcı yapmanız gereken tüm varsayılan uygulamaları geçersiz olduğunu doğru cevap verdi GetHashCode()
ve Equals()
sizin de Person
sınıf ve sonra sadece out-of-the-box kullanmak Distinct()
filtreye Linq yöntemini kopyaları dışarı.