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

Popped off Name: Homer Simpson, Age: 47

Error! Stack empty.

<p id="AutBody_Root389">Работа с классом Queue<t></t></p>

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

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

static void UseGenericQueue()

{

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

  Queue 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 вставляются три элемента. Вызов 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.

<p id="AutBody_Root390">Работа с классом SortedSet<t></t></p>

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

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

using System.Collections.Generic;

namespace FunWithGenericCollections

{

  class SortPeopleByAge : IComparer

  {

    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:

static void UseSortedSet()

{

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

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