1

リストソート関数でCompareToメソッドロジックがどのように機能するか。

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());
4

2 に答える 2

4

ジェネリックリスト(この場合はList)でSortメソッドを呼び出すと、バックグラウンドで、Sortの実装により、リストのタイプ(personクラス)がIComparableインターフェイスを実装しているかどうかがチェックされ、実装されている場合は、CompareToメンバーは、リストの要素間の比較を実行してソートを実行します。クラスがIComparableを実装するという事実は、クラスがCompareToと呼ばれるメソッドを持つpersonことを指定する「コントラクト」として解釈されます。person

Sortの実装では、次のようなスニペットを使用して、リストの要素と比較できます。

T aPerson;
T anotherPerson;
int compareResult;

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

CompareToメソッドは、呼び出されたオブジェクトを常にパラメーターと比較し、戻り値の意味は常に同じです。

* 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

内部的には、Sortメソッドは最適化された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);
}
于 2010-10-15T14:57:12.143 に答える
2

姓、名の順に並べ替えます。

2人の名前が同じである場合、ifステートメントは名前で比較されることになります。
それ以外の場合は、名前で比較します。

于 2010-10-15T14:52:27.863 に答える