C# - Queue
Queue
是一种特殊类型的集合,它以 FIFO(先进先出)的方式存储元素,这与 Stack
集合完全相反。它按元素添加的顺序包含这些元素。C# 包含泛型 Queue
和非泛型 Queue
集合。建议使用泛型 Queue
集合。
Queue 特性
Queue
是 FIFO(先进先出)集合。- 它属于
System.Collection.Generic
命名空间。 Queue
可以包含指定类型的元素。它提供编译时类型检查,并且由于它是泛型的,因此不执行装箱-拆箱操作。- 可以使用
Enqueue()
方法添加元素。不能使用集合初始化器语法。 - 可以使用
Dequeue()
和Peek()
方法检索元素。它不支持索引器。
下图展示了 Queue 集合

创建队列
您可以创建 Queue
对象,方法是为其可以存储的元素类型指定类型参数。以下示例使用 Enqueue()
方法创建 Queue
并添加元素。Queue
集合允许空值(对于引用类型)和重复值。
示例:在队列中创建并添加元素
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); //prints 1234
Queue 属性和方法
属性 | 用法 |
---|---|
Count | 返回队列中元素的总数。 |
方法 | 用法 |
---|---|
Enqueue(T) | 将一个项目添加到队列中。 |
Dequeue | 从队列开头返回一个项目并将其从队列中移除。 |
Peek() | 从队列中返回第一个项目而不将其移除。 |
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("Total elements: {0}", strQ.Count); //prints 5
while (strQ.Count > 0)
Console.WriteLine(strQ.Dequeue()); //prints Hello
Console.WriteLine("Total elements: {0}", strQ.Count); //prints 0
Peek()
方法始终从队列集合中返回第一个项目,而不将其从队列中移除。对空队列调用 Peek()
方法将抛出运行时异常 InvalidOperationException
。
示例:Peek()
Queue<string> strQ = new Queue<string>();
strQ.Enqueue("H");
strQ.Enqueue("e");
strQ.Enqueue("l");
strQ.Enqueue("l");
strQ.Enqueue("o");
Console.WriteLine("Total elements: {0}", strQ.Count); //prints 5
if(strQ.Count > 0){
Console.WriteLine(strQ.Peek()); //prints H
Console.WriteLine(strQ.Peek()); //prints H
}
Console.WriteLine("Total elements: {0}", strQ.Count); //prints 5
Contains()
Contains()
方法检查队列中是否存在某个项目。如果指定项目存在,则返回 true,否则返回 false。
Contains() 签名:bool Contains(object obj);
示例:Contains()
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