আপনি যদি কেবলমাত্র DistinctBy
কার্যকারিতাটি পেতে আপনার প্রকল্পে মোরএলিংক লাইব্রেরিটি যুক্ত করতে না চান তবে আপনি লিনকের পদ্ধতির ওভারলোডকে যুক্তি হিসাবে 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 পদ্ধতি কোন নকল আউট।