Читайте также: |
|
Класс List<T> позволяет сортировать элементы. Для метода Sort() определено несколько перегрузок. Ему могут быть переданы аргументы — обобщенный делегат Comparison<Т>, обобщенный интерфейс IComparer<T>, либо диапазон вместе с обобщенным интерфейсом IComparer<T>:
public void List<T>.Sort();
public void List<T>.Sort(Comparison<T>);
public void List<T>.Sort(IComparer<T>);
public void List<T>.Sort(Int32, Int32, ICoraparer<T>);
Метод Sort() без аргументов допускается только тогда, когда элементы в коллекции реализуют интерфейс IComparable.
Comparison<T> — это делегат для метода, который имеет два параметра типа Т и возвращает тип int. Если значения параметров равны, возвращается ноль, если первый параметр меньше второго, должно быть возвращено значение меньше нуля; в противном случае возвращается значение больше нуля.
В простой реализации метода сравнения можно использовать анонимный метод, следующем примере имеем два объекта (st1, st2) типа Student, у которых сравниваются свойства FullName с помощью строкового метода CompareTo():
students.Sort(delegate(Student st1, Student st2) {return st1.FullName.CompareTo(st2.FullName);});
При вызове этого метода весь список гонщиков сортируется по их именам (рис. 7.3).
Вместо применения делегата для сортировки коллекции также может быть применен интерфейс IComparer<T>.
Класс StudentComparer реализует интерфейс IComparer<T> для типа Student. Этот класс позволяет отсортировать коллекцию как по имени студента, так и номеру группы.
Рис. 7.3. Результаты сортировки студентов по имени
Вариант выбора сортировки по имени или группе определяется вложеным перечислимым типом CompareType. Значение CompareType передается конструктору класса StudentComparer. Интерфейс IComparer < Student > определяет метод Compare, используемый при сортировке. В реализации этого метода применяется метод CompareTo() класса String — либо по имени студента, либо по номеру группы:
class StudentComparer: IComparer<Student>
{
public enum CompareType
{
FullName,
Group
}
private CompareType compareType;
public StudentComparer(CompareType compareType)
{
this.compareType = compareType;
}
public int Compare(Student st1, Student st2)
{
int result = 0;
switch (compareType)
{
case CompareType.FullName:
result = st1.FullName.CompareTo(st2.FullName);
break;
case CompareType.Group:
result = st1.Group.CompareTo(st2.FullName);
break;
}
return result;
}
}
Когда сортируется коллекция студентов, методу Sort() передается новый экземпляр класса StudentComparer, и в следующем примере сортировка выполняется по номерам групп:
students.Sort(new StudentComparer(StudentComparer.CompareType.Group));
При вызове этого метода весь список студентов сортируется по учебной группк (рис. 7.4).
Рис. 7.4. Результаты сортировки студентов по группе
Дата добавления: 2015-07-07; просмотров: 135 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Поиск элементов | | | Преобразования типов |