كيف يعمل منطق طريقة المقارنة في وظيفة فرز القائمة؟

StackOverflow https://stackoverflow.com/questions/3943330

سؤال

كيف يعمل منطق طريقة المقارنة في وظيفة فرز القائمة.

public class person : IComparable
{
    string firstName;
    string lastName;

    public int CompareTo(object obj)
    {
        person otherPerson = (person)obj;
        if (this.lastName != otherPerson.lastName)
            return this.lastName.CompareTo(otherPerson.lastName);
        else
            return this.firstName.CompareTo(otherPerson.firstName);
    }

    public person(string _firstName, string _lastName)
    {
        firstName = _firstName;
        lastName = _lastName;
    }

    override public string ToString()
    {
        return firstName + " " + lastName;
    }
}

List<person> l = new List<person>();
l.Add(new person("Mark", "Hanson"));
l.Add(new person("Kim", "Akers"));
l.Add(new person("Zsolt", "Ambrus"));

l.Sort();

foreach (person p in l)
    Console.WriteLine(p.ToString());
هل كانت مفيدة؟

المحلول

عندما تستدعي طريقة الفرز في قائمة عامة (قائمة في حالتك) ، خلف الكوالي person الطبقة) تنفذ icomparable الواجهة ، وإذا فعل ذلك ، فسوف يستدعي قارن ب عضو لإجراء مقارنات بين عناصر القائمة لأداء النوع. حقيقة أن person يتم تفسير فئة تنفيذ icomparable على أنها "عقد" يحدد أن person سيكون للفئة طريقة تسمى المقارنة.

يمكن للتنفيذ من الفرز استخدام مقتطف مثل ما يلي للمقارنة بعناصر القائمة:

T aPerson;
T anotherPerson;
int compareResult;

if(aPerson is IComparable)
{
    compareResult = (aPerson as IComparable).CompareTo(anotherPerson);
}

تقارن طريقة المقارنة دائمًا الكائن الذي يتم استدعاؤه بالمعلمة ومعنى قيمة الإرجاع هو نفسه دائمًا:

* if the two objects are "equal", it returns 0
* if the object you are comparing to is "less than" - in a sorted list it goes before - the object you are invoking CompareTo on, it returns -1
* if the object you are comparing to is "greater than" - in a sorted list it goes after - the object you are invoking CompareTo on, it returns +1

داخليًا ، تستخدم طريقة الفرز Quicksort محسّنًا لأداء هذا النوع ولكن لتسهيل اتباعها ، إليك مثال على التنفيذ فقاعة الفرز الذي يوضح ما يحدث وراء الكواليس من حيث استدعاء واجهة icomparable:

// assume the Sort invokes this naive bubble sort 
// on the internal backing array of the list
void InternalBubbleSort(T[] backingArray) 
{
  var swapped = false;
  do {
    swapped = false;
    for(int i = 0; i < Length - 1; i++) {
      if (backingArray[i].CompareTo(backingArray[i+1]) > 0) {
        T temp = backingArray[i];
        backingArray[i] = backingArray[i+1];
        backingArray[i+1] = temp;
        swapped = true;
      }
    }while(swapped);
}

نصائح أخرى

ينفصل عن الاسم الأخير ، ثم الاسم الأول.

إذا كان لدى شخصين نفس الاسم الأخير ، if سوف ينتهي البيان بالمقارنة بالاسم الأول.
خلاف ذلك ، سوف يقارن بالاسم الأخير.

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