C# - Как реализовать несколько компараторов для IComparable <T> класс?

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

11
задан Gary Willoughby 19 March 2010 в 19:40
поделиться

4 ответа

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

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

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

14
ответ дан 3 December 2019 в 03:17
поделиться

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

9
ответ дан 3 December 2019 в 03:17
поделиться

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

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

Comparer .Default близко, но не совсем.

3
ответ дан 3 December 2019 в 03:17
поделиться

Если у вас есть несколько способов сортировки списка объектов, вам, очевидно, нужно указать, какой вариант выбрать. Для этого и нужны другие переопределения Sort. Взгляните на IComparer и Comparison.

2
ответ дан 3 December 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: