English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# Основы

C# Уровень продвинутых навыков

C# Ориентирован на объекты (OOP)

C# Queue (очередь)

Queue является специфическим типом集合а, который хранит элементы в порядке FIFO (first in, first out), что полностью противоположно Stack <T> коллекции. Она содержит элементы в порядке их добавления. C# включает в себя генерическую Queue<T> и негенерическую Queue коллекцию. Рекомендуется использовать генерическую Queue<T> коллекцию.

Характеристики Queue <T>

  • Queue<T> является FIFO (first in, first out) коллекцией.  

  • Она находится в пространстве имён System.Collection.Generic.

  • Queue<T> может содержать элементы指定ного типа. Она предоставляет проверку типов в время компиляции и не выполняет装箱/расboxing, так как является генерической.

  • Элементы можно добавить с помощью метода Enqueue(). Использование синтаксиса инициализации коллекции (collection-initializer) невозможно.

  • Элементы можно извлечь с помощью методов Dequeue() и Peek(). Она не поддерживает индексаторы.

На следующем рисунке показана коллекция Queue:

Создание очереди

Вы можете создать объект,specifying the type parameter for the element type stored in Queue<T>. В следующем примере используется метод Enqueue () для создания и добавления элементов в Queue <T>. Коллекция Queue позволяет null (для типов ссылочных) и повторяющиеся значения.

Queue<int> callerIds = new Queue<int>();
callerIds.Enqueue(1);
callerIds.Enqueue(2);
callerIds.Enqueue(3);
callerIds.Enqueue(4);
foreach(var id in callerIds)
    Console.Write(id); // Вывод 1234

Свойства и методы Queue<T>

СвойствоИспользование
CountВозвращает общее количество элементов в очереди.
МетодИспользование
Enqueue(T)Добавление элемента в очередь.
DequeueВозвращает элемент с начала очереди и удаляет его.
Peek(T)Возвращает первый элемент из очереди, не удаляя его.
Contains(T)Проверка наличия элемента в очереди
Clear()Удаление всех элементов из очереди.

Извлечение элементов из очереди

Методы Dequeue() и Peek() используются для извлечения первого элемента из集合а очереди. Метод Dequeue() удаляет и возвращает первый элемент из очереди, так как элементы хранятся в очереди в порядке FIFO. Вызов метода Dequeue() в пустой очереди вызывает исключение InvalidOperation. Поэтому перед вызовом очереди всегда проверяйте, больше ли количество элементов в очереди нуля.

Queue<string> strQ = new Queue<string>();
strQ.Enqueue("H");
strQ.Enqueue("e");
strQ.Enqueue("l");
strQ.Enqueue("l");
strQ.Enqueue("o");
Console.WriteLine("Общее количество элементов: {0}", strQ.Count); // Вывод 5
while (strQ.Count > 0){
    Console.WriteLine(strQ.Dequeue()); // Вывод Hello
}
Console.WriteLine("Общее количество элементов: {0}", strQ.Count); // Вывод 0

Метод Peek() всегда возвращает первое значение из集合а очереди, не удаляя его. Вызов этого метода в пустой очереди вызывает исключение InvalidOperationException.

Queue<string> strQ = new Queue<string>();
strQ.Enqueue("H");
strQ.Enqueue("e");
strQ.Enqueue("l");
strQ.Enqueue("l");
strQ.Enqueue("o");
Console.WriteLine("Общее количество элементов: {0}", strQ.Count); // Вывод 5
if(strQ.Count > 0){
    Console.WriteLine(strQ.Peek()); // Вывод H
    Console.WriteLine(strQ.Peek()); // Вывод H
}
Console.WriteLine("Общее количество элементов: {0}", strQ.Count); // Вывод 0

Contains()

Метод Contains() проверяет, существует ли элемент в очереди. Если указанный элемент существует, то возвращает true, в противном случае возвращает false.

Подпись Contains():

 bool Contains(object obj);
Queue<int> callerIds = new Queue<int>();
callerIds.Enqueue(1);
callerIds.Enqueue(2);
callerIds.Enqueue(3);
callerIds.Enqueue(4);
callerIds.Contains(2); //true
callerIds.Contains(10); //false