यदि आप केवल DistinctByकार्यक्षमता प्राप्त करने के लिए MoreLinq लाइब्रेरी को अपनी परियोजना में जोड़ना नहीं चाहते हैं, तो आप Linq की Distinctविधि के ओवरलोड का उपयोग करके एक ही अंतिम परिणाम प्राप्त कर सकते हैं जो एक IEqualityComparerतर्क में लेता है ।
आप एक सामान्य कस्टम समानता तुलनित्र वर्ग बनाकर शुरू करते हैं जो एक सामान्य वर्ग के दो उदाहरणों की कस्टम तुलना करने के लिए लैम्ब्डा सिंटैक्स का उपयोग करता है:
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);
}
}
फिर अपने मुख्य कोड में आप इसे इस तरह उपयोग करते हैं:
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));
देखा! :)
उपरोक्त मानता है:
- संपत्ति
Person.Idप्रकार की हैint
peopleसंग्रह किसी भी अशक्त तत्वों शामिल नहीं है
यदि संग्रह में नल हो सकते हैं, तो बस लंबोदर को नल की जांच के लिए फिर से लिखें, जैसे:
Func<Person, Person, bool> areEqual = (p1, p2) =>
{
return (p1 != null && p2 != null) ? int.Equals(p1.Id, p2.Id) : false;
};
संपादित करें
यह दृष्टिकोण व्लादिमीर नेस्टरोवस्की के उत्तर के समान है लेकिन सरल है।
यह भी जोएल के जवाब में एक के समान है, लेकिन कई गुणों वाले जटिल तुलना तर्क के लिए अनुमति देता है।
हालांकि, अगर आपके वस्तुओं ही कभी से अलग कर सकते हैं Id, फिर अन्य उपयोगकर्ता सही जवाब के डिफ़ॉल्ट कार्यान्वयन ओवरराइड है कि तुम सब करने की जरूरत है दे दी है GetHashCode()और Equals()अपने में Personवर्ग और फिर बस से बाहर के बॉक्स का उपयोग Distinct()फिल्टर करने के लिए Linq की विधि किसी भी डुप्लिकेट।