আইকোম্যাপারেবল <টি> বনাম কখন ব্যবহার করবেন IComparer <টি>


101

আমি এই ইন্টারফেসগুলির মধ্যে কোনটি প্রয়োগ করতে হবে তা সনাক্ত করার চেষ্টা করছি। তারা উভয়ই মূলত একই জিনিস করে। আমি কখন অন্যটির ওপরে ব্যবহার করব?


দুর্দান্ত উদাহরণ এবং ব্যাখ্যা এখানে পাওয়া যায়: সমর্থন.microsoft.com/nl-nl/help/320727/…
জানুয়ারী

উত্তর:


96

ওয়েল তারা না বেশ একই জিনিস IComparer<T>একটি টাইপ যে দুটি ভিন্ন বস্তু তুলনা করতে সক্ষম উপর বাস্তবায়িত হয় IComparable<T>প্রকারের নিজেদের একই ধরণের অন্য দৃষ্টান্ত সঙ্গে তুলনা করতে পারবেন উপর বাস্তবায়িত হয়।

আমি এমন IComparable<T>সময়ে ব্যবহার করার প্রবণতা রাখি যখন আমাকে জানতে হবে যে অন্য উদাহরণটি উদাহরণের সাথে কীভাবে সম্পর্কিত this। তুলনা বাইরে স্ট্যান্ড IComparer<T>হিসাবে সংগ্রহ বাছাই জন্য দরকারী IComparer<T>


9
আইসিম্পারার <T> আপনাকে প্রতিটি ধরণের সাজানোর জন্য ক্লাস করার অনুমতি দেয়। উদাহরণ; পার্সনলাস্ট ফার্স্টনেম কম্পিউটার, পার্সনফারস্টালস্টনেমকম্পার, বা পার্সোনএজকম্পারার।
এরিক স্নাইডার

এগুলি মনে রাখার জন্য কি কোনও সহজ উপায় আপনি ব্যবহার করছেন? আমি প্রতিবার এটি সন্ধান করতে হবে ঝোঁক।
amadib

59
@ আমাদিব ভাবুন IComparableযেভাবে আমি তুলনামূলক । যার অর্থ আমার সাথে অন্য কোনও কিছুর সাথে তুলনা করা যেতে পারে। এবং পড়ুন IComparerযেমন আমি তুলনামূলক, আমি কেবল তুলনা করি যার অর্থ আমি কিছু জিনিসকে তুলনা করি।
নওফাল

@ নতুনটি আপনার উত্তর হিসাবে দেওয়া উচিত ছিল। আমি মনে করি এটি এখানে সেরা ব্যাখ্যা is
জিন এস

42

ব্যবহার করুন IComparable<T>যখন বর্গ একটি স্বকীয় তুলনা হয়েছে।

IComparer<T>শ্রেণীর অভ্যন্তরীণ তুলনা বাদে অন্য তুলনামূলক পদ্ধতিটি চাইলে ব্যবহার করুন , যদি এটির একটি থাকে।


28

এটি সত্তার উপর নির্ভর করে। উদাহরণস্বরূপ "শিক্ষার্থী" এর মতো শ্রেণীর জন্য নিম্নলিখিত হিসাবে, এটি নামের উপর ভিত্তি করে আইকাম্পারেবল থাকার অর্থ হবে।

class Student : IComparable 
{
    public string Name { get; set; }
    public int MathScore { get; set; }
    public int EnglishScore { get; set; }

    public int TotalScore 
    {
        get
        {
            return this.MathScore + this.EnglishScore; 
        }
    }

    public int CompareTo(object obj)
    {
        return CompareTo(obj as Student);  
    }

    public int CompareTo(Student other)
    {
        if (other == null)
        {
            return 1;
        }
        return this.Name.CompareTo(other.Name);  
    }
}

তবে যদি কোনও শিক্ষক 'এ' ম্যাথস্কোরের ভিত্তিতে শিক্ষার্থীদের তুলনা করতে চান এবং শিক্ষক 'বি' ইংলিশস্কোরের ভিত্তিতে শিক্ষার্থীদের তুলনা করতে চান। আইসিম্পারারকে আলাদাভাবে প্রয়োগ করা ভাল ধারণা হবে। (আরও কৌশল কৌশল হিসাবে)

class CompareByMathScore : IComparer<Student>
{
    public int Compare(Student x, Student y)
    {
        if (x.MathScore > y.MathScore)
          return 1;
        if (x.MathScore < y.MathScore)
          return -1;
        else
          return 0;
    }
}

ব্যবহারের সহজতার জন্য তুলনা পদ্ধতি স্থিতিশীল করুন ।
জানুয়ারী

9

এগুলি সবই নির্ভর করে যে আপনার ধরণটি পরিবর্তনযোগ্য বা না। আপনার কেবলমাত্র অ-পরিবর্তনীয় প্রকারভেদে আইকাম্পারেবল প্রয়োগ করা উচিত । নোট করুন যে আপনি যদি আইকোমারেবল বাস্তবায়ন করেন তবে আপনাকে অবশ্যই ==,! =, <এবং> অপারেটরগুলির সাথে সমান ওভাররাইড করতে হবে (কোড বিশ্লেষণের সতর্কতা CA1036 দেখুন)।

এই ব্লগ পোস্ট থেকে ডেভ জি উদ্ধৃত :

তবে সঠিক উত্তরটি হ'ল আইকোপ্যাপারের পরিবর্তে আইসি কম্পিউটারের প্রয়োগ করা যদি আপনার বস্তুগুলি পারস্পরিক পরিবর্তনযোগ্য হয়, এবং যখন প্রয়োজন হয় তখন আইকম্পারারের একটি উদাহরণ সারণী ফাংশনগুলিতে প্রেরণ করুন।

যেহেতু আইসিম্পেয়ার কেবল সময়ে সময়ে বাছাইয়ের জন্য ব্যবহৃত হয় কেবল একটি ডিসপোজেবল অবজেক্ট, আপনার অবজেক্টে আপনার পছন্দসই কোনও পরিবর্তনযোগ্য শব্দার্থ থাকতে পারে। তদ্ব্যতীত, এটি সমান, গেটহ্যাশকোড বা == ব্যবহার করার প্রয়োজন বা এমনকি প্রস্তাব দেয় না - আপনি যে কোনও উপায়ে এটি নির্ধারণ করতে মুক্ত free

শেষ অবধি, আপনি বিভিন্ন ক্ষেত্রে বা বিভিন্ন বিধি দ্বারা বাছাই করার জন্য আপনার ধরণের জন্য একাধিক আইসি কম্পিউটারের সংজ্ঞা দিতে পারেন। এটি একটি সংজ্ঞা দিয়ে আটকে থাকার চেয়ে অনেক বেশি নমনীয়।

সংক্ষেপে: মানের ধরণের জন্য আইকোম্পারেবল এবং রেফারেন্স ধরণের জন্য আইকোম্পারার ব্যবহার করুন।


6

একটি গল্প মাধ্যমে সহজ ব্যাখ্যা

হাই স্কুল বাস্কেটবল। এটি দলগুলির জন্য একটি স্কুল ইয়ার্ড বাছাই। আমি আমার দলের মধ্যে সবচেয়ে দীর্ঘ / সেরা / দ্রুততম লোকদের পেতে চাই। আমি কি করব?

আইসিম্পেয়ার ইন্টারফেস - পৃথক দুটি লোকের সাথে তুলনা করুন

  • এটি আমাকে লাইনযুক্ত দু'জন ছেলের সাথে তুলনা করতে দেয় ......... এটি মূলত এটি। ফ্রেড বনাম জন .......... আমি তাদের একটি কংক্রিট শ্রেণিতে ফেলে দিই যা ইন্টারফেস প্রয়োগ করে imple Compare(Fred, John)এবং এটি কে আরও ভাল কেটে যায়।

আইকাম্পারেবলের কী হবে? - নিজেকে অন্য কারও সাথে তুলনা করুন

আপনি কি সম্প্রতি এফবিতে এসেছেন? আপনি অন্যান্য লোকেরা দুর্দান্ত জিনিসগুলি দেখতে পাচ্ছেন: বিশ্ব ভ্রমণ, উদ্ভাবনগুলি তৈরি করার সময়, আমি কিছুটা শীতল না করার জন্য করছি - ভাল আমরা যা করছি তা আইকোম্যাপেবল ইন্টারফেসটি ব্যবহার করা হচ্ছে।

  • আমরা বর্তমান উদাহরণটি (নিজেই) অন্য একটি বস্তুর (অন্য কারও) সাথে তুলনা করছি যা একই ধরণের (ব্যক্তি)।

তুলনামূলক ক্লাস সম্পর্কে কি?

তুলনামূলক ক্লাসটি একটি বিমূর্ত বেস শ্রেণি যা আইসিম্পারার ইন্টারফেস প্রয়োগ করে। একটি দৃ class় বাস্তবায়ন করার জন্য আপনার এই শ্রেণি থেকে নেওয়া উচিত। যাইহোক, মাইক্রোসফ্ট সুপারিশ করে যে আপনি আইসিম্পেয়ার ইন্টারফেসটি প্রয়োগ করার চেয়ে তুলনামূলক ক্লাসটি ব্যবহার করবেন:

আমরা আপনাকে সুপারিশ করি যে আপনি আইকোপ্যামার ইন্টারফেস প্রয়োগের পরিবর্তে তুলনামূলক ক্লাস থেকে উদ্ভূত হন, কারণ তুলনাকারী শ্রেণি আইকোম্পিয়ার.কম্পিয়ার পদ্ধতিটির একটি স্পষ্ট ইন্টারফেস বাস্তবায়ন সরবরাহ করে এবং ডিফল্ট সম্পত্তি যা বস্তুর জন্য ডিফল্ট তুলক হয় gets

সারসংক্ষেপ

  • আইসিম্পেয়ার - দুটি জিনিস লাইন করুন এবং তুলনা করুন।
  • আইকনপম্যাবল - এফবিতে অন্যের সাথে নিজেকে তুলনা করুন।

আশা করি গল্পগুলি আপনাকে মনে রাখতে সাহায্য করবে।


1
আমি আপনার মূল ধারণাটি চিত্রিত করার উপায়টি পছন্দ করি। আপনি যদি এই প্রতিযোগিতায় তুলনামূলক (টি) শ্রেণি অন্তর্ভুক্ত করেন তবে আরও ভাল হতে পারে। এমনকি এটি প্রশ্নের অন্তর্ভুক্ত নয়। :)
কেভম্যান

4

অন্যরা যেমন বলেছে, তারা একই কাজ করে না।

যাই হোক না কেন, এই দিনগুলিতে আমি আইসিম্পারার ব্যবহার না করার প্রবণতা রাখি। কেন আমি? এর দায়িত্ব (দুটি বস্তুর তুলনা করার জন্য একটি বাহ্যিক সত্তা) লাম্বডা এক্সপ্রেশন সহ অনেক ক্লিনার দ্বারা পরিচালিত হতে পারে, যেমন লিনকিউয়ের বেশিরভাগ পদ্ধতি কীভাবে কাজ করে। একটি তাত্ক্ষণিক ল্যাম্বদা লিখুন যা বস্তুগুলিকে আর্গুমেন্ট হিসাবে তুলনা করে এবং একটি বিল দেয় returns এবং যদি বস্তুটি তার নিজস্ব অভ্যন্তরীণ তুলনা অপারেশনটি সংজ্ঞায়িত করে তবে এটি পরিবর্তে আইকোম্যাপারেবল প্রয়োগ করতে পারে।


1
-১: একটি বিল ফিরিয়ে দেওয়া আইকম্পেরারের সমতুল্য নয়। আইসিম্পেয়ার একটি মান প্রদান করে যা শূন্য / শূন্যের চেয়ে কম / শূন্যের চেয়ে বড় হতে পারে এবং সাধারণত বাছাইয়ের জন্য ব্যবহৃত হয়।
জো

এবং যখন এটি আপনার প্রয়োজন হয়, আপনি তার পরিবর্তে একটি int (বা আরও ভাল এখনও, একটি এনাম) ফিরিয়ে দিন। আসলেই কি বড় ব্যাপার?
jalf

2
এমনকি আপনি একটি শুলও ফিরে আসতে পারেন, যেহেতু একটি ক্রম বাছাই করার জন্য আপনার প্রয়োজন কেবলমাত্র অপারেশন।
জাল্ফ

একটি আইসিএমপিয়ার বাস্তবায়ন কেবল একবার সংজ্ঞায়িত করা দরকার, যদি আপনাকে আরও জায়গায় বাছাইয়ের যুক্তি ব্যবহার করতে হয় তবে ল্যাম্বডা এক্সপ্রেশনটি আরও বার লিখতে হবে।
oɔɯǝɹ

oɔɯǝɹ - তারপরে আপনি একটি প্রতিনিধিটির একটি রেফারেন্স সঞ্চয় করতে পারেন যা ল্যাম্বডা এক্সপ্রেশন হিসাবে লেখা হয়েছিল পাশাপাশি এটি পুনরায় ব্যবহার করতে পারে।
jpierson

3

আইকোম্যাপারেবল বলেছেন যে কোনও বস্তুর সাথে অন্যের তুলনা করা যেতে পারে। আইসিম্পারার এমন একটি বস্তু যা কোনও দুটি আইটেমের তুলনা করতে পারে।


2

আইসিম্পেয়ার একটি ইন্টারফেস যা অ্যারে বাছাই করতে ব্যবহৃত হয়, এই ইন্টারফেসটি ক্লাসকে তুলনা (টি এক্স, টিওয়াই) পদ্ধতি প্রয়োগ করতে বাধ্য করবে, যা দুটি বস্তুর তুলনা করবে। এই ইন্টারফেসটি প্রয়োগ করেছে এমন শ্রেণীর উদাহরণ অ্যারের বাছাইয়ের ক্ষেত্রে ব্যবহৃত হয়।

আইকোম্যাপারেবল এমন একটি ইন্টারফেস যা টাইপের ক্ষেত্রে প্রয়োগ করা হয় যা একই ধরণের দুটি বস্তুর তুলনা করা প্রয়োজন, এই তুলনামূলক ইন্টারফেসটি ক্লাসটিকে নিম্নলিখিত পদ্ধতিটি তুলনা করতে বাধ্য করবে তুলনা করুন (টি আপত্তি)

আইক্যুয়ালিসিম্পারার একটি ইন্টারফেস যা এটি সমান কিনা বা না তা আবিষ্কার করার জন্য ব্যবহৃত হয়, এখন আমরা এটি একটি নমুনায় দেখতে পাব যেখানে আমাদের সংগ্রহের মধ্যে একটি অবজেক্টের বিচ্ছিন্নতা খুঁজে পেতে হবে। এই ইন্টারফেসটি একটি পদ্ধতির সমান (T obj1, T obj2) কার্যকর করবে

এখন আমরা একটি উদাহরণ নিই আমাদের একটি কর্মী শ্রেণি রয়েছে, এই শ্রেণীর উপর ভিত্তি করে আমাদের একটি সংগ্রহ তৈরি করতে হবে। এখন আমাদের নিম্নলিখিত প্রয়োজনীয়তা আছে।

অ্যারে ক্লাসটি ব্যবহার করে অ্যারে বাছাই করুন ২ লিনক ব্যবহার করে সংগ্রহের প্রয়োজন: ডুপ্লিকেট সরিয়ে ফেলুন, নীচে থেকে আরও নীচে অর্ডার করুন, একজন কর্মীর আইডি সরান

abstract public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { set; get; }
}

public enum SortType
{
    ByID,
    BySalary
}

পাবলিক ক্লাস এমপ্লয়আইআইডসোর্টার: আইসিম্পারার {পাবলিক ইনট তুলনা (কর্মচারী এক্স, কর্মচারী y) {যদি (x.Id <y.Id) ফেরত 1; অন্যথায় যদি (x.Id> y.Id) -1 ফিরে আসে; অন্যথায় 0 ফিরে; }}

    public class EmployeeSalarySorter : IComparer<Employee>
    {
        public int Compare(Employee x, Employee y)
        {
            if (x.Salary < y.Salary)
                return 1;
            else if (x.Salary > y.Salary)
                return -1;
            else
                return 0;
        }
    }

আরও তথ্যের জন্য নীচে দেখুন http://dotnetvisio.blogspot.in/2015/12/usage-of-icomparer-icomparable- and.html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.