Язык программирования 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>
Очереди — это контейнеры, которые
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}
};
// Обратите внимание, что элементы отсортированы по возрасту.
Поделиться с друзьями: