Очередь Queue в C#

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Очередь — это структура данных, содержащая один или несколько элементов одного типа и работающая по принципу FIFO («first in — first out», «первый вошел — первый вышел»). В отличие от списка или массива, очередь не допускает произвольный доступ к своим элементам — чтение происходит только с первого элемента по порядку до конца. Так же, мы не можем поместить новый элемент в произвольную позицию очереди — только в конец очереди.

Класс Queue<T> представляет собой очередь в C#. Рассмотрим основные моменты работы с очередью в C#.

Когда оправдано использование очереди?

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

Пример очереди в C#

Все мы прекрасно знаем, как работают различные электронные очереди в банках, больницах и т.д. Попробуем реализовать электронную очередь в C#. То есть, нам необходимо сделать так, чтобы первый, поставленный в очередь элемент (клиент) первым из этой очереди и вызывался.

//создаем очередь клиентов
Queue<string> clients = new Queue<string>();
//добавляем в очередь элементы
clients.Enqueue("А1");
clients.Enqueue("А2");
clients.Enqueue("B1");
clients.Enqueue("B2");

//создаем очередь свободных окон
Queue<string> windows = new Queue<string>(2);
windows.Enqueue("Окно 1");
windows.Enqueue("Окно 2");

//вызываем клиентов. Первый вошел - первый вышел
while (clients.Count > 0)
{
    string client = clients.Dequeue();
    if (windows.Count > 0)
        Console.WriteLine($"Клиент {client} --> {windows.Dequeue()}");
    else
    {
        Console.WriteLine($"Клиент {client} остается ждать");
    }
}

Здесь создается две очереди:

  1. Очередь клиентов (clients)
  2. Очередь свободных окон (windows)

Используя метод Enqueue, в очередь клиентов добавляются четыре клиента, а в очередь окон два свободных окна. Обратите внимание на создание очереди windows:

Queue<string> windows = new Queue<string>(2);

Здесь в круглых скобках мы указываем начальную емкость хранилища — два элемента.

Далее, используя метод Dequeue мы «вызываем» клиентов по очереди к свободным окнам. Если все окна заняты, то выводим сообщение о том, что клиент остается в очереди ожидания. Результат выполнения программы будет следующим:

Клиент А1 —> Окно 1
Клиент А2 —> Окно 2
Клиент B1 остается ждать
Клиент B2 остается ждать

Методы Queue

Основные методы Queue представлены в таблице ниже:

Clear() Удаляет все объекты из Queue<T>.
Contains(T) Определяет, входит ли элемент в коллекцию Queue<T>.
CopyTo(T[], Int32) Копирует элементы коллекции Queue<T> в существующий одномерный массив Array, начиная с указанного значения индекса массива.
Dequeue() Удаляет объект из начала очереди Queue<T> и возвращает его.
Enqueue(T) Добавляет объект в конец коллекции Queue<T>.
Peek() Возвращает объект, находящийся в начале очереди Queue<T>, но не удаляет его.
ToArray() Копирует элементы Queue<T> в новый массив.
TrimExcess() Устанавливает емкость равной фактическому количеству элементов в Queue<T>, если это количество составляет менее 90 процентов текущей емкости.
TryDequeue(T) Удаляет объект в начале Queue<T> и копирует его в параметр result.
TryPeek(T) Возвращает значение, указывающее, имеется ли в начале Queue<T> объект, и если он присутствует, копирует его в параметр result. Объект не удаляется из Queue<T>.

Стоит обратить внимание на следующий момент: при попытке получить элемент из очереди, используя методы Enqueue или Peek может возникнуть исключение, если очередь будет пуста. Чтобы избежать исключения мы можем воспользоваться методами TryDequeue или TryPeek или же проверить количество элементов перед вызовом методов, например, так как мы это делали в примере выше:

if (windows.Count > 0)
    Console.WriteLine($"Клиент {client} --> {windows.Dequeue()}");
else
{
    Console.WriteLine($"Клиент {client} остается ждать");
}

Итого

Сегодня мы рассмотрели ещё одну структуру данных — очередь. Очередь в C# позволяет организовать работу с коллекцией по принципу FIFO — первый зашел — первый вышел. В отличие от обычного списка List<T> в очереди мы не можем получить доступ к произвольному элементу.

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии