
6. Порівняння і сортування елементів списку
Для сортування елементів списку є 4 методи:
Sort() - сортує елементи в усьому списку List<T> за допомогою компаратора за замовчанням.
Sort(Comparison<T>) - сортує елементи в усьому списку List<T> з використанням вказаного делегата System.Comparison<T>.
Sort(IComparer<T>) - сортує елементи в усьому списку List<T> за допомогою вказаного компаратора.
Sort(Int32, Int32, IComparer<T>) - сортує елементи в діапазоні елементів списку List<T> за допомогою вказаного компаратора.
Приклад 5. Використання методу Sort()
https://msdn.microsoft.com/ru-ru/library/b0zbh7b6(v=vs.110).aspx
У наступному прикладі демонструється метод Sort() і метод BinarySearch(T). Створюється список рядків List<T>, який заповнюється чотирма рядками в довільному порядку. Список виводиться, сортується і потім виводиться знову.
Потім використовується метод BinarySearch(T) для пошуку двох рядків, не включених у список, і ці рядки вставляються за допомогою методу Insert. Результат виконання методу BinarySearch буде негативним в кожному випадку, оскільки рядки не входять у список. Порозрядне доповнення (оператор ~ в C# і Visual C++, Xor - 1 в Visual Basic) цього негативного числа дає індекс першого елементу в списку, більшого, ніж шуканий рядок, і вставка в цю позицію дозволяє зберегти порядок сортування. Другий шуканий рядок більше будь-якого елементу списку, тому позиція вставки доводиться на кінець списку.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lab
{
public class Example
{
public static void Main()
{
List<string> dinosaurs = new List<string>();
dinosaurs.Add("Pachycephalosaurus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Mamenchisaurus");
dinosaurs.Add("Deinonychus");
Console.WriteLine();
foreach (string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
Console.WriteLine("\nSort");
dinosaurs.Sort();
Console.WriteLine();
foreach (string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
Console.WriteLine("\nBinarySearch and Insert \"Coelophysis\":");
int index = dinosaurs.BinarySearch("Coelophysis");
if (index < 0)
{
dinosaurs.Insert(~index, "Coelophysis");
}
Console.WriteLine();
foreach (string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
Console.WriteLine("\nBinarySearch and Insert \"Tyrannosaurus\":");
index = dinosaurs.BinarySearch("Tyrannosaurus");
if (index < 0)
{
dinosaurs.Insert(~index, "Tyrannosaurus");
}
Console.WriteLine();
foreach (string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}
Console.ReadKey();
}
}
}
Приклад 6. Використання методу Sort() для сортування списку об’єктів класу
Для пошуку і сортування об’єктів класів необхідно зробити клас, який реалізує об’єкти нащадком інтерфейсу IComparable<Т> і реалізувати метод CompareTo().
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lab
{
public class Person: IComparable<Person>
{
public string Name { get; set; } //имя
public int Age { get; set; } // возраст
public int Height { get; set; }
public string Role { get; set; } // роль
public string GetName() { return Name; }
public int GetAge() { return Age; }
public Person(string n, int age, int h)
{
this.Name = n;
this.Age = age;
this.Height = h;
}
public int CompareTo(Person p)
{
//Порівняння об'єктів за віком
Person pers = p as Person;
if (pers != null)
return this.Age.CompareTo(p.Age);
else
throw new ArgumentException("об'єкт не належить до типу Person");
}
public void Passport()
{
Console.WriteLine("Name = {0} Age = {1} Height = {2} ", Name, Age, Height);
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Сортування списку ");
List<Person> pers = new List<Person>();
pers.Add(new Person("Іванов", 18, 176));
pers.Add(new Person("Петров", 20, 180));
pers.Add(new Person("Морозов", 21, 170));
pers.Add(new Person("Соколов", 30, 170));
pers.Add(new Person("Авілов", 25, 176));
Console.WriteLine("Колекція до сортування");
foreach (Person elem in pers) elem.Passport();
pers.Sort();
Console.WriteLine("Колекція після сортування за віком");
foreach (Person elem in pers) elem.Passport();
Console.ReadKey();
}
} }
Для порівняння об’єктів за двома критеріями потрібно зробити клас нащадком інтерфейсу IComparer<T>.
Приклад (до курсової роботи)
В цьому прикладі в консольному проекті створюється клас Student з трьома конструкторами. Перший конструктор ініціалізує властивості класу при створенні об’єкту класу. Використовується при додаванні об’єкту в програмі. Другий конструктор приймає як параметр рядок тексту, прочитаний з файлу, виділяє з нього характеристики і призначає їх властивостям класу. Цей конструктор використовується для додавання студента до колекції. Третій конструктор – без параметрів.
Опис класу Student:
class Student: IComparable<Student>
{
//Властивості
public string FirstName { get; set; } //ім'я
public string LastName { get; set; } //прізвище
public int Course { get; set; }
public int Rating { get; set; }
public Student(string f, string n, int cource, int rating)
{
//перший конструктор з параметрами
//ініціалізація властивостей класу
LastName = f;
FirstName = n;
Course = cource;
Rating = rating;
}
public Student(string s)
{
// другий конструктор приймає рядок тексту, прочитаний з файлу, як параметр,
// виділяє з нього слова і призначає їх властивостям класу.
string[] split = s.Split(new Char[] { '*' });
LastName = split[0].Trim();
FirstName = split[1].Trim();
Course = int.Parse(split[2].Trim());
Rating = int.Parse(split[3].Trim());
}
public Student()
{
// третій конструктор без параметрів
}
// методи класу
public void St_Rating(int student_rating)
{
if (student_rating >= 82)
Console.WriteLine("Привіт відмінникам");
else
if (student_rating <= 45)
Console.WriteLine("Перездача! Треба краще вчитися!");
else
Console.WriteLine("Можна вчитися ще краще!");
}
public int CompareTo(Student s)
{
//Порівняння об'єктів за рейтингом
Student stud = s as Student;
if (stud != null)
return this.Rating.CompareTo(s.Rating);
else
throw new ArgumentException("об'єкт не належить до типу Student");
}
public void Passport()
{
Console.WriteLine("LastName = {0} FirstName = {1} Course = {2} Rating = {3}", LastName, FirstName, Course, Rating);
}
}
У програмі виконується робота зі списком студентів.
class Program
{
static void Main(string[] args)
{
List<Student> listStudent = new List<Student>(); //список студентів
string s;
StreamReader f = new StreamReader("Students.txt");
while ((s = f.ReadLine()) != null)
{
listStudent.Add(new Student(s)); //створення об'єктів і додавання в колекцію
}
f.Close();
//робота зі списком
//початкова колекція
foreach (Student stud in listStudent)
stud.Passport();
listStudent.Sort();
Console.WriteLine("Колекція після сортування за рейтингом");
foreach (Student stud in listStudent)
stud.Passport();
//додати ще студента
listStudent.Add(new Student("Зайченко","Артем",2,75));
Console.WriteLine("Колекція після додавання");
foreach (Student stud in listStudent)
stud.Passport();
Console.ReadKey();
}
}