আইকোম্যাপারেবল এবং আইকোয়াটেবল ইন্টারফেসের মধ্যে পার্থক্য কী?


উত্তর:


189

IEquatable দুটি বস্তু সমান কিনা তা পরীক্ষা করে।

IComparable তুলনামূলকভাবে বস্তুগুলিতে মোট ক্রম চাপায়।

উদাহরণস্বরূপ, IEquatableআপনাকে বলবে যে 5টি 7 এর সমান নয় you আপনাকে IComparableবলবে যে 5 আসার আগে 7 আসে।



10

গ্রেগ ডি এর উত্তর ছাড়াও:

আপনি কোনও শ্রেণীর জন্য বাস্তবায়ন IComparableছাড়াই বাস্তবায়ন করতে পারেন IEquatableযেখানে আংশিক অর্ডারিংয়ের অর্থ হয় এবং আপনি অবশ্যই নিশ্চিতভাবে গ্রাহককে CompareTo()শূন্য ফেরতের কারণ নির্ধারণ করতে চান , এটি বোঝায় না যে বস্তুগুলি সমান (সাজানোর উদ্দেশ্যে ব্যতীত অন্য কোনও কিছুর জন্য)।


10
এটি IComparableযথাযথভাবে প্রয়োগ করা কোনও অবজেক্টের চেয়ে বিশেষ-কেস তুলনাকারীর মতো শোনাচ্ছে । আপনি যদি একটি অর্থপূর্ণ উদাহরণ যেখানে সঙ্গে আসা পর্যন্ত করতে পারি CompareTo(…) == 0না না সমতা পরোক্ষভাবে? আমি অবশ্যই পারি না। বস্তুত, ইন্টারফেস চুক্তি (দুটিই MSDN অনুযায়ী) প্রয়োজন যে CompareTo(…) == 0সমতা বোঝা। এটিকে অস্পষ্টভাবে বলতে গেলে, আপনার মতো একটি ক্ষেত্রে একটি বিশেষ Comparatorঅবজেক্ট ব্যবহার করুন , প্রয়োগ করবেন নাIComparable
কনরাড রুডল্ফ

4
@ কনরাড - আমি বেশ কয়েকটি সতর্কতামূলক ইঙ্গিত দিয়েছি - যে প্রকারটি আইকুয়েটেবল প্রয়োগ করে না (সুতরাং স্পষ্টতই, প্রবর্তক সমতা পরীক্ষা অন্তর্ভুক্ত করতে চান না), এবং যে তুলনা ফলাফলগুলি বাছাইয়ের জন্য ব্যবহার করা হয়, সাম্যের মূল্যায়ন করার জন্য নয় । আপনি যে প্রশ্নগুলির মধ্যে সাম্যতা প্রাসঙ্গিক সেগুলির প্রশ্নও পেতে পারেন (রেফারেন্স, মান, "নির্বিচারে" গুণাবলী উপেক্ষা করে - আইকোপমারেবলের উদ্দেশ্যে, 500 পৃষ্ঠার দৈর্ঘ্যের একটি নীল বই 500 পৃষ্ঠার দৈর্ঘ্যের একটি লাল বইয়ের সাথে "সমান" হতে পারে)
ড্যামিয়েন_এ_বিশ্বাসীরা

4
আপনার শেষ বাক্যটি ভুল, এবং এটিই আমি বিশেষ ভুলটি উল্লেখ করতে চেয়েছিলাম: IComparableএখানে সম্পূর্ণ অনুপযুক্ত। আপনি যা পেয়েছেন তা একটি বিশেষ অর্ডার যা কেবলমাত্র একটি বিশেষ পরিস্থিতিতে প্রযোজ্য। যেমন পরিস্থিতিতে, একটি জেনারেল বাস্তবায়ন IComparableভুল। এটি কি IComparerজন্য আছে। উদাহরণস্বরূপ, লোকদের অর্থপূর্ণ অর্ডার দেওয়া যায় না। তবে তাদের বেতন, জুতার আকার, তাদের ফ্রিকলসের সংখ্যা বা ওজন অনুযায়ী তাদের অর্ডার করা যেতে পারে। অতএব, আমরা IComparerএই সমস্ত ক্ষেত্রে বিভিন্ন গুলি প্রয়োগ করব ।
কনরাড রুডল্ফ

4
@ কনরাড রুডলফ: "শিডিউডএভেন্ট" শ্রেণীর মতো কিছু, যা নির্দিষ্ট সময়ে "কিছু" করার কথা বলে? এই ধরণের শব্দার্থক শব্দটি খুব শক্তিশালী প্রাকৃতিক শব্দার্থক অর্ডারকে বোঝায় যে কখন এই পদক্ষেপ নেওয়া হবে তার উপর ভিত্তি করে, তবে সহজেই একই সাথে বিভিন্ন ঘটনা ঘটতে পারে। একজনকে ম্যানুয়ালি নির্দিষ্ট করা আইকোম্পারার ব্যবহারের প্রয়োজন হতে পারে তবে আমি এড়াতে পারি যে ক্লাসে একটি তুলনামূলক নির্মিত আরও সুবিধাজনক হবে।
সুপারক্যাট

4
@ সুপের্যাট সুবিধার্থে গুরুত্বপূর্ণ, তবে এটি সব কিছু নয়। সঠিকতা (যেমন লজিকাল ধারাবাহিকতা) আরও গুরুত্বপূর্ণ এবং স্ট্যাটিক টাইপ সিস্টেমটি এই যৌক্তিক ধারাবাহিকতা যাচাই করার জন্য একটি গুরুত্বপূর্ণ সরঞ্জাম। আপনি যে ইন্টারফেসগুলি প্রয়োগ করেছেন তার নথিভুক্ত চুক্তি লঙ্ঘন করে আপনি টাইপ সিস্টেমটি বিকৃত করছেন। এই না একটি ভাল ধারণা, এবং আমি এটা বলতে না। এই ধরনের পরিস্থিতিতে একটি বাহ্যিক তুলক ব্যবহার করুন।
কনরাড রুডল্ফ

7

আইকুয়েটেবলের জন্য এমএসডিএন পৃষ্ঠাতে যেমন বলা হয়েছে :

আইকোম্যাপেবল ইন্টারফেস CompareToপদ্ধতিটি সংজ্ঞায়িত করে , যা প্রয়োগকারী ধরণের উদাহরণগুলির সাজানোর ক্রম নির্ধারণ করে। আইকোয়াটেবল ইন্টারফেস Equalsপদ্ধতিটি সংজ্ঞায়িত করে , যা প্রয়োগকারী ধরণের উদাহরণগুলির সাম্যতা নির্ধারণ করে।

Equals বনাম CompareTo


4

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;
        }
    }
}

4
এই দুর্দান্ত ব্যাখ্যার জন্য ধন্যবাদ। প্রশ্ন: কেন নেই IEquatableএকটি জেনেরিক ব্যবহার <Person>এবং IComparableনা?
মার্চীন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.