Шрифт:
Интервал:
Закладка:
First Names: Lisa
First Names: Bart
В классе List<T> определено множество дополнительных членов, представляющих интерес, поэтому за полным их описанием обращайтесь в документацию. Давайте рассмотрим еще несколько обобщенных коллекций, в частности Stack<T>, Queue<T> и SortedSet<T>, что должно способствовать лучшему пониманию основных вариантов хранения данных в приложении.
Работа с классом Stack<T>
Класс Stack<T> представляет коллекцию элементов, которая обслуживает элементы в стиле "последний вошел — первый вышел" (LIFO). Как и можно было ожидать, в Stack<T> определены члены Push() и Pop(), предназначенные для вставки и удаления элементов из стека. Приведенный ниже метод создает стек объектов Person:
static void UseGenericStack()
{
Stack<Person> stackOfPeople = new();
stackOfPeople.Push(new Person { FirstName = "Homer",
LastName = "Simpson", Age = 47 });
stackOfPeople.Push(new Person { FirstName = "Marge",
LastName = "Simpson", Age = 45 });
stackOfPeople.Push(new Person { FirstName = "Lisa",
LastName = "Simpson", Age = 9 });
<b> // Просмотреть верхний элемент, вытолкнуть его и просмотреть снова..</b>
Console.WriteLine("First person is: {0}", stackOfPeople.Peek());
Console.WriteLine("Popped off {0}", stackOfPeople.Pop());
Console.WriteLine("nFirst person is: {0}", stackOfPeople.Peek());
Console.WriteLine("Popped off {0}", stackOfPeople.Pop());
Console.WriteLine("nFirst person item is: {0}", stackOfPeople.Peek());
Console.WriteLine("Popped off {0}", stackOfPeople.Pop());
try
{
Console.WriteLine("nnFirst person is: {0}", stackOfPeople.Peek());
Console.WriteLine("Popped off {0}", stackOfPeople.Pop());
}
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})catch (InvalidOperationException ex)
{
Console.WriteLine("nError! {0}", ex.Message); // Ошибка! Стек пуст
}
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})}
В коде строится стек, который содержит информацию о трех лицах, добавленных в алфавитном порядке следования их имен: 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<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);
- Понимание SQL - Мартин Грубер - Базы данных