سؤال

أحاول معرفة أي من هذه الواجهات التي أحتاج إلى تنفيذها. كلاهما يفعلون نفس الشيء في الأساس. متى يمكنني استخدام واحد على الآخر؟

هل كانت مفيدة؟

المحلول

حسنا انهم ليسوا كذلك الى حد كبير نفس الشيء كما IComparer<T> يتم تنفيذه على نوع قادر على مقارنة كائنين مختلفين بينما IComparable<T> يتم تنفيذه على أنواع قادرة على مقارنة نفسها مع مثيلات أخرى من نفس النوع.

أنا أميل إلى استخدام IComparable<T> للأوقات التي أحتاج فيها إلى معرفة كيف تتعلق مثيل آخر this نموذج. IComparer<T> مفيد لمجموعات الفرز كما IComparer<T> يقف خارج المقارنة.

نصائح أخرى

يستخدم IComparable<T> عندما يكون للفئة مقارنة جوهرية.

يستخدم IComparer<T> عندما تريد طريقة مقارنة بخلاف المقارنة الجوهرية للفئة، إذا كان لديه واحد.

ذلك يعتمد على الكيان. على سبيل المثال، فيما يلي فئة مثل "الطالب"، فمن المنطقي أن يكون لديك مثمر على أساس الاسم.

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

ولكن إذا كان المعلم "A" يريد مقارنة الطلاب بناء على Mathorsore، والمعلم "B" يريد مقارنة الطلاب بناء على الإنجليزي. سيكون من الجيد تنفيذ Icomparer بشكل منفصل. (أشبه نمط استراتيجية)

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

كل هذا يتوقف على ما إذا كان نوعك قابل للتغيير أم لا. يجب فقط تنفيذ المعهد على أنواع غير قابلة للتغيير. لاحظ أنه إذا قمت بالتنفيذ غير قابل للتدمير، فيجب عليك تجاوز يساوي، جنبا إلى جنب مع ==،! =، <و> المشغلين (انظر تحليل تحليل الكود CA1036).

نقلا عن ديف ز من هذه المدونة post.:

لكن الإجابة الصحيحة هي تطبيق Icomparer بدلا من الصياد إذا كانت الكائنات الخاصة بك قابلة للتغيير، وتمرير مثيل من Icomparer إلى فرز الوظائف عند الضرورة.

نظرا لأن Icomparer هو مجرد كائن يمكن التخلص منها المستخدمة في الفرز في هذه المرحلة الزمنية، يمكن أن يكون لك كائنك أي دلالات قابلة للتغيير. علاوة على ذلك، لا يتطلب ذلك أو حتى اقتراح باستخدام يساوي، Gethashcode، أو == - أنت حر في تحديد ذلك بأي طريقة من فضلك.

أخيرا، يمكنك تحديد جهاز iComparer المتعدد لنوعك للفرز في حقول مختلفة أو مع قواعد مختلفة. هذا أكثر مرونة بكثير من تعالى مع تعريف واحد.

بالمختصر: استخدم مضغوطا لأنواع القيمة والكومبيين لأنواع مرجعية.

شرح بسيط عبر قصة

كرة السلة المدرسة الثانوية. انها فناء المدرسة اختيار للفرق. أريد الحصول على أطول / أفضل / أسرع الناس في فريقي. ماذا أفعل؟

واجهة Icomparer - قارن شخصين منفصلين

  • هذا يسمح لي بمقارنة أي رجالين اصطفوا ......... هذا هو أساسا. فريد مقابل جون .......... رميهم في فئة ملموسة تنفذ الواجهة. Compare(Fred, John) وهو يبصق من هو أفضل.

ماذا عن المعهد؟ - قارن نفسك مع شخص آخر

هل كنت في FB مؤخرا؟ ترى أشخاصا آخرين يقومون بأشياء رائعة: السفر في العالم، وخلق الاختراعات، بينما أفعل شيئا ما ليس رائعا - حسنا، ما نفعله هو الاستفادة من الواجهة المعادية.

  • نحن نقارن المثيل الحالي (نفسك) مع كائن آخر (شخص آخر) وهو من نفس النوع (الشخص).

ماذا عن الفئة المقارنة؟

الطبقة المقارنة هي فئة قاعدة مجردة تنفذ واجهة Icomparer. يجب أن تستمد من هذا الفصل للحصول على تنفيذ ملموس. على أي حال، توصي Microsoft باستخدام الفئة المقارنة بدلا من تطبيق واجهة Icomparer:

نوصي بأننا تستمد من الفئة المقارنة بدلا من تطبيق واجهة Icomparer، لأن الفئة المقارنة توفر طريقة واجهة صريحة لطريقة Icomparer.comPare والخاصية الافتراضية التي تحصل على مقارنة الافتراضي للكائن.

ملخص

  • Icomparerer - يصطف شيئين ومقارنة.
  • تعزز - قارن نفسك مع الآخرين على FB.

نأمل أن تساعدك القصص في تذكر.

كما قال آخرون، لا يفعلون نفس الشيء.

في أي حال، هذه الأيام التي أميل فيها عدم استخدام Icomparer. لماذا سوف؟ مسؤوليتها (كيان خارجي يستخدم لمقارنة كائنين) يمكن معالجة الكثير من الأنظف مع تعبير Lambda، على غرار كيفية عمل أساليب LINQ. اكتب Lambda السريع الذي يأخذ الكائنات لمقارنة الحجج، وإرجاع BOOL. وإذا كان الكائن يحدد تشغيله الجوهري الخاص به، فيمكنه التنفيذ غير مناسب بدلا من ذلك.

المعتدل يقول إنه يمكن مقارنة كائن آخر. Icomparer هو كائن يمكن مقارنة أي عنصرين.

Icomparer هو واجهة تستخدم لفرز الصفيف، وسوف تجبر هذه الواجهة الفصل على تنفيذ طريقة قارن (T X و T Y)، والتي ستقوم بمقارنة الكائنتين. يتم استخدام مثيل الفصل الذي تم تنفيذه هذه الواجهة في فرز الصفيف.

المعتدل هو واجهة يتم تنفيذ واجهة في النوع الذي يحتاج إلى مقارنة الكائنتين من نفس النوع، وسوف تجبر هذه الواجهة القابلة للمقارنة الفصل على تنفيذ الطريقة التالية في مقارنة الطريقة التالية (T OBJ)

Iequalitycomparer هو واجهة تستخدم للعثور على الكائن ما إذا كان متساويا أم لا، الآن سنرى هذا في عينة حيث يتعين علينا العثور على تميز كائن في مجموعة. ستنفذ هذه الواجهة طريقة تساوي (T OBJ1، T OBJ2)

الآن نأخذ مثالا لدينا فئة موظف، بناء على هذه الفئة لدينا لإنشاء مجموعة. الآن لدينا المتطلبات التالية.

فرز الصفيف باستخدام فئة الصفيف 2. تحتاج إلى مجموعة باستخدام LinQ: قم بإزالة مكررة، والنظام أعلى إلى أسفل، وإزالة معرف موظف واحد

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

public enum SortType
{
    ByID,
    BySalary
}

موظف فئة عامة: Icomparer {Int int مقارنة (الموظف X، الموظف Y) {IF (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.inoupspot.ino النسخة //12/usage-ic-icomparer-icomparable-and.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top