簡體   English   中英

如何實現多個CompareTo方法?

[英]How to implement multiple CompareTo methods?

我有一個自定義的通用數組/容器,它有一個排序方法:

public void Sort()
{
    for (int i = 0; i < Count; i++)
    {
        int min = i;
        for (int j = i + 1; j < Count; j++)
            if (Items[j].CompareTo(Items[min]) < 0)
                min = j;

        if (min == i) continue;
        T temp = Items[i];
        Items[i] = Items[min];
        Items[min] = temp;
    }
}

項目是T對象的數組。 T實現IComparable並具有CompareTo方法:

public int CompareTo(object obj)
{
    if (!(obj is Player))
        return -1;

    Player player = (Player)obj;
    if (Name.CompareTo(player.Name) < 0)
        return -1;
    else if (Name.CompareTo(player.Name) == 0)
        return LastName.CompareTo(player.LastName);
    else
        return 1;
}

播放器類具有3個屬性:名稱,姓氏和分數。 這可以按名稱和姓氏對元​​素進行排序,效果很好,但是現在我需要另一個容器,該容器應按分數排序(第三個屬性)。 如何在不使用List和內置OrderBy,Sort方法的情況下實現兩種不同的比較方法

是否可以通過某種方式將類屬性傳遞給Sort方法?

Container<Player> sortedByName = playerList.Sort(Name, LastName);
Container<Player> sortedByScore = playerList.Sort(Score);

不要使用IComparable 這將創建始終使用相同條件知道如何進行比較的對象。

相反,創建一個外部IComparer實際上是兩個! 一個知道如何按名稱比較兩個球員,另一個知道如何按分數比較他們。

您可以在此處查看如何與標准Sort使用。 或者,您也可以將它用在自己的Sort方法中,方法是使用comparer.Compare(Items[j], Items[min])替換Items[j].CompareTo(Items[min]) comparer.Compare(Items[j], Items[min])

您應該實現IComparer<T> 然后,您可以更改您的排序方法以接受它:

public class PlayerNameComparer : IComparer<Player>
{
    public int Compare(Player x, Player y)
    {
        if (x.Name.CompareTo(y.Name) < 0)
            return -1;
        else if (x.Name.CompareTo(y.Name) == 0)
            return x.LastName.CompareTo(y.LastName);
        else
            return 1;
    }
}

以及修改后的Sort方法:

public void Sort(IComparer<Player> comparer)
{
    for (int i = 0; i < Count; i++)
    {
        int min = i;
        for (int j = i + 1; j < Count; j++)
            if (comparer.Compare(Items[j], Items[min]) < 0)
                min = j;

        if (min == i) continue;
        T temp = Items[i];
        Items[i] = Items[min];
        Items[min] = temp;
    }
}

用法示例:

collection.Sort(new PlayerNameComparer());
collection.Sort(new ScoreComparer());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM