11

我有一个实现 IComparable 的类。

public class MyClass : IComparable<MyClass>
{
    public int CompareTo(MyClass c)
    {
        return this.whatever.CompareTo(c.whatever);
    }

    etc..
}

然后我可以调用我的类的通用列表的排序方法

List<MyClass> c = new List<MyClass>();
//Add stuff, etc.

c.Sort();

并根据我的比较器对列表进行排序。

如何根据 MyClass 的其他属性指定进一步的比较器以不同的方式对我的集合进行排序,以便让用户以多种不同的方式对我的集合进行排序?

4

4 回答 4

14

要在您的班级中设置排序:

public static Comparison<MyClass> OtherComparison = delegate(MyClass object1, MyClass object2)
{
    return object1.Whatever.CompareTo(object2.Whatever);
};

然后使用您的新比较进行排序:

List<MyClass> myClassList = new List<MyClass>();
myClassList.Sort(MyClass.OtherComparison);

除非您显然不想对空列表进行排序:)

于 2010-03-19T19:45:52.193 回答
9

您可以使用特定的比较器作为参数调用 Sort。参考:MSDN

于 2010-03-19T19:43:33.243 回答
3

朝着这个方向迈出的一步是使用让您指定 an 的 Sort 重载IComparer<T>(但不是IComparable<T>)。

如果您已经有很多实现,那么编写一个比较两个实例IComparable<T>的通用实现应该是微不足道的。事实上,我有点惊讶 BCL 中还没有这样的类,但我一直找不到。IComparer<T>IComparable<T>

Comparer<T>.Default接近,但不完全。

于 2010-03-19T19:51:42.717 回答
2

如果您有多种方法对对象列表进行排序,则显然必须指定要选择的选项。这就是 Sort 的其他覆盖的好处。看看 IComparer 和比较。

于 2010-03-19T19:46:24.680 回答