উভয় ইন্টারফেস সমতা জন্য বস্তুর তুলনা বলে মনে হচ্ছে, তাই তাদের মধ্যে প্রধান পার্থক্য কি?
উভয় ইন্টারফেস সমতা জন্য বস্তুর তুলনা বলে মনে হচ্ছে, তাই তাদের মধ্যে প্রধান পার্থক্য কি?
উত্তর:
IEquatable<T>
সমতা জন্য।
IComparable<T>
আদেশের জন্য।
গ্রেগ ডি এর উত্তর ছাড়াও:
আপনি কোনও শ্রেণীর জন্য বাস্তবায়ন IComparable
ছাড়াই বাস্তবায়ন করতে পারেন IEquatable
যেখানে আংশিক অর্ডারিংয়ের অর্থ হয় এবং আপনি অবশ্যই নিশ্চিতভাবে গ্রাহককে CompareTo()
শূন্য ফেরতের কারণ নির্ধারণ করতে চান , এটি বোঝায় না যে বস্তুগুলি সমান (সাজানোর উদ্দেশ্যে ব্যতীত অন্য কোনও কিছুর জন্য)।
IComparable
এখানে সম্পূর্ণ অনুপযুক্ত। আপনি যা পেয়েছেন তা একটি বিশেষ অর্ডার যা কেবলমাত্র একটি বিশেষ পরিস্থিতিতে প্রযোজ্য। যেমন পরিস্থিতিতে, একটি জেনারেল বাস্তবায়ন IComparable
ভুল। এটি কি IComparer
জন্য আছে। উদাহরণস্বরূপ, লোকদের অর্থপূর্ণ অর্ডার দেওয়া যায় না। তবে তাদের বেতন, জুতার আকার, তাদের ফ্রিকলসের সংখ্যা বা ওজন অনুযায়ী তাদের অর্ডার করা যেতে পারে। অতএব, আমরা IComparer
এই সমস্ত ক্ষেত্রে বিভিন্ন গুলি প্রয়োগ করব ।
আইকুয়েটেবলের জন্য এমএসডিএন পৃষ্ঠাতে যেমন বলা হয়েছে :
আইকোম্যাপেবল ইন্টারফেস
CompareTo
পদ্ধতিটি সংজ্ঞায়িত করে , যা প্রয়োগকারী ধরণের উদাহরণগুলির সাজানোর ক্রম নির্ধারণ করে। আইকোয়াটেবল ইন্টারফেসEquals
পদ্ধতিটি সংজ্ঞায়িত করে , যা প্রয়োগকারী ধরণের উদাহরণগুলির সাম্যতা নির্ধারণ করে।
Equals
বনাম CompareTo
IComparable <T>
একটি নির্দিষ্ট নির্দিষ্ট তুলনা পদ্ধতি সংজ্ঞায়িত করে যা বস্তুগুলি অর্ডার বা সাজানোর জন্য ব্যবহার করা যেতে পারে।
IEquatable <T>
একটি সাধারণীকরণ পদ্ধতি সংজ্ঞা দেয় যা সাম্যতা নির্ধারণের জন্য প্রয়োগ করতে ব্যবহার করা যেতে পারে।
ধরা যাক আপনার ব্যক্তিগত ক্লাস রয়েছে
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person p1 = new Person() { Name = "Person 1", Age = 34 };
Person p2 = new Person() { Name = "Person 2", Age = 31 };
Person p3 = new Person() { Name = "Person 3", Age = 33 };
Person p4 = new Person() { Name = "Person 4", Age = 26 };
List<Person> people = new List<Person> { p1, p2, p3, p4 };
people.Sort();
।তবে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে।
ফ্রেমওয়ার্ক এই জিনিসগুলি কীভাবে বাছাই করতে পারে তা জানে না। প্রয়োগকারী IComparable
ইন্টারফেসটি কীভাবে বাছাই করতে হবে তা আপনাকে জানাতে হবে ।
public class Person : IComparable
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(object obj)
{
Person otherPerson = obj as Person;
if (otherPerson == null)
{
throw new ArgumentNullException();
}
else
{
return Age.CompareTo(otherPerson.Age);
}
}
}
এটি Sort()
পদ্ধতির সাথে অ্যারেটি সঠিকভাবে সাজান ।
Equals()
পদ্ধতিটি ব্যবহার করতে পারেন ।var newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
এটি ফিরে আসবেfalse
কারণ Equals
পদ্ধতিটি কীভাবে দুটি বস্তুর তুলনা করতে পারে তা জানে না। অতএব আপনার IEquatable
ইন্টারফেস বাস্তবায়ন করতে হবে এবং তুলনা কীভাবে করা যায় তা কাঠামোটি জানাতে হবে। পূর্ববর্তী উদাহরণটি প্রসারিত করা এটিকে দেখতে ভাল লাগবে।
public class Person : IComparable, IEquatable<Person>
{
//Some code hidden
public bool Equals(Person other)
{
if (Age == other.Age && Name == other.Name)
{
return true;
}
else
{
return false;
}
}
}
IEquatable
একটি জেনেরিক ব্যবহার <Person>
এবং IComparable
না?
IComparable
যথাযথভাবে প্রয়োগ করা কোনও অবজেক্টের চেয়ে বিশেষ-কেস তুলনাকারীর মতো শোনাচ্ছে । আপনি যদি একটি অর্থপূর্ণ উদাহরণ যেখানে সঙ্গে আসা পর্যন্ত করতে পারিCompareTo(…) == 0
না না সমতা পরোক্ষভাবে? আমি অবশ্যই পারি না। বস্তুত, ইন্টারফেস চুক্তি (দুটিই MSDN অনুযায়ী) প্রয়োজন যেCompareTo(…) == 0
সমতা বোঝা। এটিকে অস্পষ্টভাবে বলতে গেলে, আপনার মতো একটি ক্ষেত্রে একটি বিশেষComparator
অবজেক্ট ব্যবহার করুন , প্রয়োগ করবেন নাIComparable
।