তারা কী সেটির প্রাথমিক সংজ্ঞা আপনি ইতিমধ্যে পেয়েছেন । সংক্ষেপে বলতে গেলে, আপনি যদি বাস্তবায়ন IEquatable<T>
বর্গ উপর T
, Equals
প্রকারের একটি বস্তু উপর পদ্ধতি T
আপনি বলে যদি বস্তুর নিজেই (এক সমতার জন্য পরীক্ষা করা হচ্ছে) একই ধরণের আরেকটি দৃষ্টান্ত সমান T
। যেখানে সাধারণত IEqualityComparer<T>
দুটি উদাহরণের ক্ষেত্রের T
বাইরে যে কোনও দুটি উদাহরণের সাম্যতা পরীক্ষা করার জন্য T
।
হিসেবে তারা কি জন্য প্রথমে বিভ্রান্তিকর হতে পারে। সংজ্ঞা থেকে এটি স্পষ্ট হওয়া উচিত যে অতএব IEquatable<T>
(শ্রেণিতে T
নিজেই সংজ্ঞায়িত ) এর বিষয়গুলি / উদাহরণগুলির স্বতন্ত্রতা উপস্থাপনের জন্য ডি-ফ্যাক্টো স্ট্যান্ডার্ড হওয়া উচিত। HashSet<T>
, Dictionary<T, U>
(বিবেচনা GetHashCode
করা পাশাপাশি ওভাররাইড করা হয়), ইত্যাদি ব্যবহার Contains
করুন List<T>
make বাস্তবায়নকারী IEqualityComparer<T>
উপর T
উপরে উল্লিখিত সাধারণ ক্ষেত্রে সাহায্য করে না। পরবর্তীতে, ব্যতীত IEquatable<T>
অন্য কোনও শ্রেণিতে প্রয়োগের জন্য খুব কম মূল্য রয়েছে T
। এই:
class MyClass : IEquatable<T>
খুব কমই বোঝা যায়।
অন্য দিকে
class T : IEquatable<T>
{
//override ==, !=, GetHashCode and non generic Equals as well
public bool Equals(T other)
{
//....
}
}
এটি করা উচিত কিভাবে।
IEqualityComparer<T>
সাম্যতার একটি কাস্টম বৈধতা প্রয়োজন হলে কার্যকর হতে পারে, তবে সাধারণ নিয়ম হিসাবে নয়। উদাহরণস্বরূপ, কোনও এক শ্রেণিতে Person
আপনার বয়সের উপর ভিত্তি করে দুটি ব্যক্তির সমতা পরীক্ষা করতে হতে পারে। সেক্ষেত্রে আপনি করতে পারেন:
class Person
{
public int Age;
}
class AgeEqualityTester : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return x.Age == y.Age;
}
public int GetHashCode(Person obj)
{
return obj.Age.GetHashCode;
}
}
তাদের পরীক্ষা করার জন্য, চেষ্টা করুন
var people = new Person[] { new Person { age = 23 } };
Person p = new Person() { age = 23 };
print people.Contains(p); //false;
print people.Contains(p, new AgeEqualityTester()); //true
একইভাবে IEqualityComparer<T>
উপর T
অর্থে দেখা যায় না।
class Person : IEqualityComparer<Person>
সত্য এটি কাজ করে তবে চোখের কাছে ভাল লাগে না এবং যুক্তিটিকে পরাভূত করে।
সাধারণত আপনার যা প্রয়োজন তা হ'ল IEquatable<T>
। এছাড়াও আদর্শভাবে আপনার কেবল একটি থাকতে পারে IEquatable<T>
যখন IEqualityComparer<T>
বিভিন্ন মানদণ্ডের ভিত্তিতে একাধিক সম্ভব possible
IEqualityComparer<T>
এবং IEquatable<T>
ঠিক অনুরূপ হয় Comparer<T>
এবং IComparable<T>
যা বরং equating চেয়ে তুলনা উদ্দেশ্যে ব্যবহার করা হয়; এখানে একটি ভাল থ্রেড যেখানে আমি একই উত্তর লিখেছি :)
EqualityComparer<T>
ইন্টারফেস বাস্তবায়নের পরিবর্তে উত্তরাধিকারEqualityComparer<T>
IEquatable<T>