Литмир - Электронная Библиотека
A
A

First Names: Lisa

First Names: Bart

В классе

List<T>
определено множество дополнительных членов, представляющих интерес, поэтому за полным их описанием обращайтесь в документацию. Давайте рассмотрим еще несколько обобщенных коллекций, в частности
Stack<T>
,
Queue<T>
и
SortedSet<T>
, что должно способствовать лучшему пониманию основных вариантов хранения данных в приложении.

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

Класс

Stack&lt;T&gt;
представляет коллекцию элементов, которая обслуживает элементы в стиле "последний вошел — первый вышел" (LIFO). Как и можно было ожидать, в
Stack&lt;T&gt;
определены члены
Push()
и
Pop()
, предназначенные для вставки и удаления элементов из стека. Приведенный ниже метод создает стек объектов
Person
:

static void UseGenericStack()

{

  Stack&lt;Person&gt; stackOfPeople = new();

  stackOfPeople.Push(new Person { FirstName = &quot;Homer&quot;,

                                  LastName = &quot;Simpson&quot;, Age = 47 });

  stackOfPeople.Push(new Person { FirstName = &quot;Marge&quot;,

                                  LastName = &quot;Simpson&quot;, Age = 45 });

  stackOfPeople.Push(new Person { FirstName = &quot;Lisa&quot;,

                                  LastName = &quot;Simpson&quot;, Age = 9 });

<b>  // Просмотреть верхний элемент, вытолкнуть его и просмотреть снова..</b>

  Console.WriteLine(&quot;First person is: {0}&quot;, stackOfPeople.Peek());

  Console.WriteLine(&quot;Popped off {0}&quot;, stackOfPeople.Pop());

  Console.WriteLine(&quot;\nFirst person is: {0}&quot;, stackOfPeople.Peek());

  Console.WriteLine(&quot;Popped off {0}&quot;, stackOfPeople.Pop());

  Console.WriteLine(&quot;\nFirst person item is: {0}&quot;, stackOfPeople.Peek());

  Console.WriteLine(&quot;Popped off {0}&quot;, stackOfPeople.Pop());

  try

  {

    Console.WriteLine(&quot;\nnFirst person is: {0}&quot;, stackOfPeople.Peek());

    Console.WriteLine(&quot;Popped off {0}&quot;, stackOfPeople.Pop());

  }

  catch (InvalidOperationException ex)

  {

    Console.WriteLine(&quot;\nError! {0}&quot;, ex.Message);  // Ошибка! Стек пуст

  }

}

В коде строится стек, который содержит информацию о трех лицах, добавленных в алфавитном порядке следования их имен:

Homer
,
Marge
и
Lisa
. Заглядывая (посредством метода
Реек()
) в стек, вы будете всегда видеть объект, находящийся на его вершине; следовательно, первый вызов
Реек()
возвращает третий объект
Person
. После серии вызовов
Pop()
и
Peek()
стек, в конце концов, опустошается, после чего дополнительные вызовы
Реек()
и
Pop()
приводят к генерации системного исключения. Вот как выглядит вывод:

***** 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&lt;T&gt;
подходит наилучшим образом. Дополнительно к функциональности, предоставляемой поддерживаемыми интерфейсами, в
Queue
определены основные члены, перечисленные в табл. 10.6.

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

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

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

static void UseGenericQueue()

{

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

  Queue&lt;Person&gt; peopleQ = new();

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

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

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

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

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

206
{"b":"847442","o":1}