C# 队列(Queue)
在 C# 中,Queue 是一个先进先出(FIFO, First In First Out)数据结构。
Queue 属于 System.Collections 或 System.Collections.Generic 命名空间,分别提供非泛型和泛型版本的实现。Queue 适用于需要按照入队顺序处理数据的场景。
队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。
特性
- 先进先出:最早加入队列的元素最先被移除。
- 动态大小:队列的容量会根据需要动态调整。
- 泛型支持:通过
Queue<T>
可以存储强类型的元素。 - 线程安全:
Queue
本身不是线程安全的,但可以使用ConcurrentQueue<T>
实现线程安全。
Queue 类的方法和属性
下表列出了 Queue 类的一些常用的 属性:
属性名称 | 类型 | 描述 |
---|---|---|
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;
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($"Contains 'Second': {queue.Contains("Second")}"); // 输出:True
// 转数组
object[] array = queue.ToArray();
Console.WriteLine($"Array Length: {array.Length}"); // 输出:2
}
}
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($"Contains 'Second': {queue.Contains("Second")}"); // 输出:True
// 转数组
object[] array = queue.ToArray();
Console.WriteLine($"Array Length: {array.Length}"); // 输出:2
}
}
实例 2
using System;
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Queue q = new Queue();
q.Enqueue('A');
q.Enqueue('M');
q.Enqueue('G');
q.Enqueue('W');
Console.WriteLine("Current queue: ");
foreach (char c in q)
Console.Write(c + " ");
Console.WriteLine();
q.Enqueue('V');
q.Enqueue('H');
Console.WriteLine("Current queue: ");
foreach (char c in q)
Console.Write(c + " ");
Console.WriteLine();
Console.WriteLine("Removing some values ");
char ch = (char)q.Dequeue();
Console.WriteLine("The removed value: {0}", ch);
ch = (char)q.Dequeue();
Console.WriteLine("The removed value: {0}", ch);
Console.ReadKey();
}
}
}
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Queue q = new Queue();
q.Enqueue('A');
q.Enqueue('M');
q.Enqueue('G');
q.Enqueue('W');
Console.WriteLine("Current queue: ");
foreach (char c in q)
Console.Write(c + " ");
Console.WriteLine();
q.Enqueue('V');
q.Enqueue('H');
Console.WriteLine("Current queue: ");
foreach (char c in q)
Console.Write(c + " ");
Console.WriteLine();
Console.WriteLine("Removing some values ");
char ch = (char)q.Dequeue();
Console.WriteLine("The removed value: {0}", ch);
ch = (char)q.Dequeue();
Console.WriteLine("The removed value: {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