Читаем Язык программирования C#9 и платформа .NET5 полностью

Предыдущую реализацию метода CompareTo можно усовершенствовать с учетом того факта, что тип данных int в C# (который представляет собой просто сокращенное обозначение для типа System.Int32) реализует интерфейс IComparable. Реализовать CompareTo в Car можно было бы так:


int 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 Rusty

234 Mary

34 Viper

4 Mel

5 Chucky


Here is the ordered set of cars:

1 Rusty

4 Mel

5 Chucky

34 Viper

234 Mary

Указание множества порядков сортировки с помощью IComparer

В текущей версии класса Car в качестве основы для порядка сортировки используется идентификатор автомобиля (CarID). В другом проектном решении основой сортировки могло быть дружественное имя автомобиля (для вывода списка автомобилей в алфавитном порядке). А что если вы хотите построить класс Car, который можно было бы подвергать сортировке по идентификатору и также по дружественному имени? В таком случае вы должны ознакомиться с еще одним стандартным интерфейсом по имени IComparer, который определен в пространстве имен System.Collections следующим образом:


// Общий способ сравнения двух объектов.

interface IComparer

{

  int Compare(object o1, object o2);

}


На заметку! Обобщенная версия этого интерфейса (IСоmраrаble<Т>) обеспечивает более безопасный в отношении типов способ обработки операций сравнения объектов. Обобщения подробно рассматриваются в главе 10.


В отличие от IСоmраrаble интерфейс IComparer обычно не реализуется в типе, который вы пытаетесь сортировать (т.е. Car). Взамен данный интерфейс реализуется в любом количестве вспомогательных классов, по одному для каждого порядка сортировки (на основе дружественного имени, идентификатора автомобиля и т.д.). В настоящий момент типу Car уже известно, как сравнивать автомобили друг с другом по внутреннему идентификатору. Следовательно, чтобы позволить пользователю объекта сортировать массив объектов Car по дружественному имени, потребуется создать дополнительный вспомогательный класс, реализующий интерфейс IComparer. Вот необходимый код (не забудьте импортировать в файл кода пространство имен System.Collections):


using System;

using System.Collections;

namespace ComparableCar

{

  // Этот вспомогательный класс используется для сортировки

  // массива объектов Car по дружественному имени.

  public class PetNameComparer : IComparer

  {

    // Проверить дружественное имя каждого объекта.

    int IComparer.Compare(object o1, object o2)

    {

      if (o1 is Car t1 && o2 is Car t2)

      {

        return string.Compare(t1.PetName, t2.PetName,

Перейти на страницу:

Похожие книги

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT