У меня есть класс, который реализует 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, чтобы позволить пользователям отсортировать мой набор различными способами?
Чтобы настроить сортировку в вашем классе:
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);
Только вы явно не захотите сортировать пустой список :)
Вы можете вызвать Sort с конкретным компаратором в качестве аргумента. Ссылка: MSDN
Одним из шагов в этом направлении было бы использование перегрузки Sort, позволяющей указать IComparer
(но не IComparable
).
Если у вас уже есть много реализаций IComparable
, будет тривиально написать универсальную реализацию IComparer
, сравнивающую два IComparable
экземпляров. На самом деле, я немного удивлен, что такого класса еще нет в BCL, но я не смог его найти.
Comparer
близко, но не совсем.
Если у вас есть несколько способов сортировки списка объектов, вам, очевидно, нужно указать, какой вариант выбрать. Для этого и нужны другие переопределения Sort. Взгляните на IComparer и Comparison.