Язык программирования C#9 и платформа .NET5
Часть 181 из 642 Информация о книге
...// Реализация интерфейса IComparable.int IComparable.CompareTo(object obj){if (obj is Car temp){if (this.CarID > temp.CarID){return 1;}if (this.CarID < temp.CarID){return -1;}return 0;}throw new ArgumentException("Parameter is not a Car!");// Параметр не является объектом типа Car!}}Как видите, логика метода
заключается в сравнении входного объекта с текущим экземпляром на основе специфичного элемента данных. Возвращаемое значение методаCompareTo()применяется для выяснения того, является текущий объект меньше, больше или равным объекту, с которым он сравнивается (табл. 8.1).CompareTo()Предыдущую реализацию метода
можно усовершенствовать с учетом того факта, что тип данныхCompareTo()в C# (который представляет собой просто сокращенное обозначение для типаint) реализует интерфейсSystem.Int32. РеализоватьIComparableвCompareTo()можно было бы так:Carint IComparable.CompareTo(object obj){if (obj is Car temp){return this.CarID.CompareTo(temp.CarID);}throw new ArgumentException("Parameter is not a Car!");// Параметр не является объектом типа Car!}В любом случае, поскольку тип
понимает, как сравнивать себя с подобными объектами, вы можете написать следующий тестовый код:Car// Использование интерфейса IComparable.// Создать массив объектов Car....// Отобразить текущее содержимое массива.Console.WriteLine("Here is the unordered set of cars:");foreach(Car c in myAutos){Console.WriteLine("{0} {1}", c.CarID, c.PetName);}// Теперь отсортировать массив с применением IComparable!Array.Sort(myAutos);Console.WriteLine();// Отобразить отсортированное содержимое массива.Console.WriteLine("Here is the ordered set of cars:");foreach(Car c in myAutos){Console.WriteLine("{0} {1}", c.CarID, c.PetName);}Console.ReadLine();Ниже показан вывод, полученный в результате выполнения приведенного выше кода:
***** Fun with Object Sorting *****Here is the unordered set of cars:1 Rusty234 Mary34 Viper4 Mel5 ChuckyHere is the ordered set of cars:1 Rusty4 Mel5 Chucky34 Viper234 MaryУказание множества порядков сортировки с помощью IComparer
В текущей версии класса
в качестве основы для порядка сортировки используется идентификатор автомобиля (Car). В другом проектном решении основой сортировки могло быть дружественное имя автомобиля (для вывода списка автомобилей в алфавитном порядке). А что если вы хотите построить классCarID, который можно было бы подвергать сортировке по идентификатору и также по дружественному имени? В таком случае вы должны ознакомиться с еще одним стандартным интерфейсом по имениCar, который определен в пространстве именIComparerследующим образом:System.Collections// Общий способ сравнения двух объектов.interface IComparer{int Compare(object o1, object o2);}На заметку! Обобщенная версия этого интерфейса (
) обеспечивает более безопасный в отношении типов способ обработки операций сравнения объектов. Обобщения подробно рассматриваются в главе 10.IСоmраrаble<Т>В отличие от
интерфейсIСоmраrаbleобычно не реализуется в типе, который вы пытаетесь сортировать (т.е.IComparer). Взамен данный интерфейс реализуется в любом количестве вспомогательных классов, по одному для каждого порядка сортировки (на основе дружественного имени, идентификатора автомобиля и т.д.). В настоящий момент типуCarуже известно, как сравнивать автомобили друг с другом по внутреннему идентификатору. Следовательно, чтобы позволить пользователю объекта сортировать массив объектовCarпо дружественному имени, потребуется создать дополнительный вспомогательный класс, реализующий интерфейсCar. Вот необходимый код (не забудьте импортировать в файл кода пространство именIComparer):System.Collections
