首页 > 解决方案 > 如何实现多个 CompareTo 方法?

问题描述

我有一个自定义的通用数组/容器,它有一个排序方法:

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

Items 是一个 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;
}

Player 类有 3 个属性:Name、LastName 和 Score。这可以很好地按名称和姓氏对元​​素进行排序,但现在我需要另一个应该按分数排序的容器(第三个属性)。如何在不使用 List 和内置 OrderBy、Sort 方法的情况下实现两种不同的比较方法

是否可以以某种方式将类属性传递给 Sort 方法?

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

标签: c#generics

解决方案


不要使用IComparable. 这将创建知道如何比较自己的对象,始终使用相同的标准。

相反,制作一个外部的IComparer- 实际上是两个!一个知道如何按名字比较两个球员,一个知道如何按分数比较他们。

Sort 您可以在此处查看如何将其与标准一起使用。或者你可以把它用在你自己的Sort方法中,Items[j].CompareTo(Items[min])comparer.Compare(Items[j], Items[min])


推荐阅读