C# Очередь
В C# Queue — это структура данных, работающая по принципу «первым пришёл — первым вышел» (FIFO).
Queue относится к пространствам имён System.Collections или System.Collections.Generic, которые предоставляют соответственно необобщённую и обобщённую реализации. Queue подходит для сценариев, в которых данные должны обрабатываться в порядке их постановки в очередь.
Queue представляет собойпервым пришёл — первым вышелколлекцию объектов. Когда вам нужен доступ к элементам по принципу «первым пришёл — первым вышел», используйте очередь. Когда вы добавляете элемент в список, это называетсяEnqueue, а когда удаляете элемент из списка, это называетсяИзвлечь из очереди。
Особенности
- первым пришёл — первым вышел: элемент, добавленный в очередь раньше всех, удаляется первым.
- Динамический размер: ёмкость очереди динамически регулируется по мере необходимости.
- Поддержка обобщений: с помощью
Queue<T>может хранить строго типизированные элементы. - Потокобезопасность:
Queueсам по себе не является потокобезопасным, но можно использоватьConcurrentQueue<T>Реализация потокобезопасности.
Методы и свойства класса Queue
В таблице ниже перечисленыQueueНекоторые распространённые способы использования классаСвойство:
| Имя атрибута | Type | Описание |
|---|---|---|
Count | int | Получает количество элементов в очереди. |
SyncRoot | object | для получения объекта для синхронизации доступа к очереди (необобщённой). |
IsSynchronized | bool | Указывает, синхронизирован ли доступ к очереди (потокобезопасный, всегдаfalse)。 |
В таблице ниже перечисленыQueueНекоторые распространённые способы использования классаМетоды:
| Название метода | Тип возвращаемого значения | Описание |
|---|---|---|
| Операции с элементами | ||
Enqueue(object item) | void | Добавляет элемент в конец очереди. |
Dequeue() | object | Удаляет и возвращает элемент, находящийся в начале очереди. |
Peek() | object | Возвращает элемент, находящийся в начале очереди, не удаляя его. |
Clear() | void | Удаляет все элементы из очереди. |
| Проверка и копирование | ||
Contains(object item) | bool | Определяет, содержится ли элемент в очереди. |
ToArray() | object[] | Копирует элементы очереди в новый массив. |
Clone() | object | Создает поверхностную копию текущей очереди. |
CopyTo(Array array, int index) | void | Копирует элементы очереди в существующий массив, начиная с указанного индекса. |
| Поддержка перечислителя | ||
GetEnumerator() | IEnumerator | Возвращает перечислитель, осуществляющий перебор элементов очереди. |
| Потокобезопасность | ||
Synchronized(Queue queue) | Queue | Возвращает потокобезопасную оболочку очереди. |
Пример
В следующем примере демонстрируется использование Queue:
Пример 1
using System.Collections;
class Program
{
static void Main()
{
Queue queue = new Queue();
// Добавить элементы
queue.Enqueue("First");
queue.Enqueue("Second");
queue.Enqueue("Third");
// Просмотреть начало
Console.WriteLine($"Peek: {queue.Peek()}"); // Вывод: First
// Удалить элемент
Console.WriteLine($"Dequeue: {queue.Dequeue()}"); // Вывод: First
// Оставшиеся элементы
foreach (var item in queue)
{
Console.WriteLine(item); // Вывод: Second, Third
}
// Проверить наличие
Console.WriteLine($"Содержит 'Second': {queue.Contains("Second")}"); // вывод: True
// Преобразовать в массив
object[] array = queue.ToArray();
Console.WriteLine($"Длина массива: {array.Length}"); // Вывод: 2
}
}
Пример 2
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Queue q = new Queue();
q.Добавление в очередь('A');
q.Добавление в очередь('M');
q.Добавление в очередь('G');
q.Добавление в очередь('W');
Console.WriteLine("Текущая очередь: ");
foreach (char c in q)
Console.Write(c + " ");
Console.WriteLine();
q.Добавление в очередь('V');
q.Добавление в очередь('H');
Console.WriteLine("Текущая очередь: ");
foreach (char c in q)
Console.Write(c + " ");
Console.WriteLine();
Console.WriteLine("Удаление некоторых значений ");
char ch = (char)q.Dequeue();
Console.WriteLine("Удалённое значение: {0}", ch);
ch = (char)q.Dequeue();
Console.WriteLine("Удалённое значение: {0}", ch);
Console.ReadKey();
}
}
}
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
Current queue: A M G W Current queue: A M G W V H Removing values The removed value: A The removed value: MДругие расширения