Как реализовать несколько компараторов для класса IComparable <T>? - PullRequest
11 голосов
/ 19 марта 2010

У меня есть класс, который реализует 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 ]

14 голосов
/ 19 марта 2010

Чтобы настроить сортировку в вашем классе:

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

Только вы явно не захотите сортировать пустой список:)

9 голосов
/ 19 марта 2010

Вы можете вызвать сортировку с определенным компаратором в качестве аргумента. Ссылка: MSDN

3 голосов
/ 19 марта 2010

Одним из шагов в этом направлении будет использование перегрузки Sort, которая позволяет указать IComparer<T> (но не IComparable<T>).

Если у вас уже есть множество реализаций IComparable<T>, написать тривиальную реализацию IComparer<T> общего назначения, которая сравнивает два экземпляра IComparable<T>, будет тривиально. На самом деле, я немного удивлен, что такой класс еще не существует в BCL, но я не смог его найти.

Comparer<T>.Default подходит близко, но не совсем.

2 голосов
/ 19 марта 2010

Если у вас есть несколько способов сортировки списка ваших объектов, вам, очевидно, придется указать, какой вариант выбрать.Это то, для чего хороши другие переопределения Сорта.Посмотрите на IComparer и Сравнение.

...