C# - How to implement multiple comparers for an IComparable<T> class?

一笑奈何 提交于 2020-01-10 10:14:29

问题


I have a class that implements IComparable.

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

    etc..
}

I then can call the sort method of a generic list of my class

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

c.Sort();

and have the list sorted according to my comparer.

How do i specify further comparers to sort my collection different ways according to the other properties of MyClass in order to let users sort my collection in a number of different ways?


回答1:


To setup the sort in your class:

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

Then to sort using your new comparison:

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

Except you clearly will not want to sort an empty list :)




回答2:


You can call Sort with a specific comparer as the argument. Reference: MSDN




回答3:


One step in that direction would be to use the Sort overload that let's you specify an IComparer<T> (not an IComparable<T>, though).

If you already have a lot of IComparable<T> implementations, it should be trivial to write a general-purpose implementation of IComparer<T> that compares two IComparable<T> instances. In fact, I'm a bit surprised such a class doesn't already exist in the BCL, but I haven't been able to find one.

Comparer<T>.Default comes close, but not quite.




回答4:


If you have multiple ways to sort a list of your objects, you obviously have to specify which option to choose. That's what the other overrides of Sort are good for. Have a look at IComparer and Comparison.



来源:https://stackoverflow.com/questions/2480111/c-sharp-how-to-implement-multiple-comparers-for-an-icomparablet-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!