// Удалить всех из очереди.
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()
{
<b> // Создать несколько объектов Person с разными значениями возраста.</b>
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}
};
<b> // Обратите внимание, что элементы отсортированы по возрасту.</b>
foreach (Person p in setOfPeople)
{
Console.WriteLine(p);
}
Console.WriteLine();
<b> // Добавить еще несколько объектов Person с разными значениями возраста.</b>
setOfPeople.Add(new Person { FirstName = "Saku", LastName = "Jones", Age = 1 });
setOfPeople.Add(new Person { FirstName = "Mikko", LastName = "Jones", Age = 32 });
<b> // Элементы по-прежнему отсортированы по возрасту.</b>
foreach (Person p in setOfPeople)
{
Console.WriteLine(p);
}