Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

***** Fun with Generic Collections *****

First person is: Name: Lisa Simpson, Age: 9

Popped off Name: Lisa Simpson, Age: 9

First person is: Name: Marge Simpson, Age: 45

Popped off Name: Marge Simpson, Age: 45

First person item is: Name: Homer Simpson, Age: 47

Popped off Name: Homer Simpson, Age: 47

Error! Stack empty.

Работа с классом Queue<T>

Очереди — это контейнеры, которые

обеспечивают доступ к элементам в стиле "первый вошел — первый вышел" (FIFO). К сожалению, людям приходится сталкиваться с очередями практически ежедневно: в банке, в супермаркете, в кафе. Когда нужно смоделировать сценарий, в котором элементы обрабатываются в режиме FIFO, класс
Queue<T>
подходит наилучшим образом. Дополнительно к функциональности, предоставляемой поддерживаемыми интерфейсами, в
Queue
определены основные члены, перечисленные в табл. 10.6.

Теперь давайте посмотрим на описанные методы в работе. Можно снова задействовать класс

Person
и построить объект
Queue<T>
, эмулирующий очередь людей, которые ожидают заказанный кофе.

static void UseGenericQueue

{

// Создать очередь из трех человек.

Queue<Person> peopleQ = new;

peopleQ.Enqueue(new Person {FirstName= "Homer", LastName="Simpson", Age=47});

peopleQ.Enqueue(new Person {FirstName= "Marge", LastName="Simpson", Age=45});

peopleQ.Enqueue(new Person {FirstName= "Lisa", LastName="Simpson", Age=9});

// Заглянуть, кто первый в очереди.

Console.WriteLine("{0} is first in line!", peopleQ.Peek.FirstName);

// Удалить всех из очереди.

GetCoffee(peopleQ.Dequeue);

GetCoffee(peopleQ.Dequeue);

GetCoffee(peopleQ.Dequeue);

// Попробовать извлечь кого-то из очереди снова

try

{

GetCoffee(peopleQ.Dequeue);

}

catch(InvalidOperationException e)

{

Console.WriteLine("Error! {0}", e.Message); //Ошибка! Очередь пуста.

}

// Локальная вспомогательная функция

static void GetCoffee(Person p)

{

Console.WriteLine("{0} got coffee!", p.FirstName);

}

}

Здесь с применением метода

Enqueue
в
Queue<T>
вставляются три элемента. Вызов
Peek
позволяет просматривать (но не удалять) первый элемент, находящийся в текущий момент внутри
Queue
. Наконец, вызов
Dequeue
удаляет элемент из очереди и передает его на обработку вспомогательной функции
GetCoffee
. Обратите внимание,
что если попытаться удалить элемент из пустой очереди, то сгенерируется исключение времени выполнения. Ниже показан вывод, полученный в результате вызова метода
UseGenericQueue
:

***** Fun with Generic Collections *****

Homer is first in line!

Homer got coffee!

Marge got coffee!

Lisa got coffee!

Error! Queue empty.

Работа с классом SortedSet<T>

Класс

SortedSet<T>
полезен тем, что при вставке или удалении элементов он автоматически обеспечивает сортировку элементов в наборе. Однако классу
SortedSet<T>
необходимо сообщить, каким образом должны сортироваться объекты, путем передачи его конструктору в качестве аргумента объекта, который реализует обобщенный интерфейс
IComparer<T>
.

Начните с создания нового класса по имени

SortPeopleByAge
, реализующего интерфейс
IComparer<T>
, где
Т
— тип
Person
. Вспомните, что в этом интерфейсе определен единственный метод по имени
Compare
, в котором можно запрограммировать логику сравнения элементов. Вот простая реализация:

using System.Collections.Generic;

namespace FunWithGenericCollections

{

class SortPeopleByAge : IComparer<Person>

{

public int Compare(Person firstPerson, Person secondPerson)

{

if (firstPerson?.Age > secondPerson?.Age)

{

return 1;

}

if (firstPerson?.Age < secondPerson?.Age)

{

return -1;

}

return 0;

}

}

}

Теперь добавьте в класс

Program
следующий новый метод, который позволит продемонстрировать применение
SortedSet<Person>
:

static void UseSortedSet

{

// Создать несколько объектов Person с разными значениями возраста.

SortedSet<Person> setOfPeople = new SortedSet<Person>(new SortPeopleByAge)

{

new Person {FirstName= "Homer", LastName="Simpson", Age=47},

new Person {FirstName= "Marge", LastName="Simpson", Age=45},

new Person {FirstName= "Lisa", LastName="Simpson", Age=9},

new Person {FirstName= "Bart", LastName="Simpson", Age=8}

};

// Обратите внимание, что элементы отсортированы по возрасту.

Поделиться с друзьями: