C#队列(Queue)简单使用方法

队列作为一种基础且实用的数据结构,遵循"先进先出"(First-In, First-Out, FIFO)原则,广泛应用于各种编程场景。

1.创建Queue

在C#中,创建一个队列首先要引用System.Collections.Generic命名空间,并声明队列变量。Queue<T>是泛型类,允许存储任何类型的元素。创建不同队列的Demo如下:
csharp 复制代码
// 创建一个整数类型的队列
Queue<int> integerQueue = new Queue<int>();

// 创建一个字符串类型的队列
Queue<string> stringQueue = new Queue<string>();

队列的默认构造函数:创建一个空队列,具有默认初始容量和增长因子。

csharp 复制代码
Queue<int> defaultQueue = new Queue<int>();

队列可以指定初始容量:创建一个空队列,但预先分配指定大小的内部存储空间,以优化内存使用。初始容量后跟默认的增长因子。

csharp 复制代码
Queue<int> capacityQueue = new Queue<int>(100);

2.队列操作

2.1 添加元素

使用Enqueue方法将元素添加到队列的末尾(即队尾)。

csharp 复制代码
integerQueue.Enqueue(10);
stringQueue.Enqueue("Hello, World!");

2. 2取出元素

移除并返回队首元素:Dequeue方法用于从队列的开头(即队首)移除并返回元素,同时改变队列状态。

csharp 复制代码
int firstInteger = integerQueue.Dequeue();
string firstString = stringQueue.Dequeue();

只查看队首元素(不移除):如果只需查看队首元素而不希望影响队列,可以使用Peek方法。

csharp 复制代码
int peekedInteger = integerQueue.Peek();
string peekedString = stringQueue.Peek();

2. 3判断队列状态

检查队列是否为空:通过IsEmpty属性或比较Count属性与零值来确定队列是否包含元素。

csharp 复制代码
bool isEmpty = integerQueue.IsEmpty; // 或
isEmpty = integerQueue.Count == 0;

获取队列中元素数量:使用Count属性获取当前队列内元素的数量。

csharp 复制代码
int count = integerQueue.Count;

2.4 遍历队列

借助foreach循环可以轻松遍历队列中的所有元素,遍历过程中不会改变队列状态。

csharp 复制代码
foreach (int item in integerQueue)
{
    Console.WriteLine(item);
}

// 或使用 LINQ 查询
var sortedItems = integerQueue.OrderBy(i => i).ToList();

2.5 清空队列

当需要移除队列中的所有元素时,调用Clear方法。

csharp 复制代码
integerQueue.Clear();

3 .实际应用

3.1 任务调度

队列在任务调度系统中扮演重要角色,用于按接收顺序执行异步任务。新任务被Enqueue至队列,后台线程则不断Dequeue并执行任务。这种模式确保了任务按照提交顺序得到处理,避免了并发问题。
csharp 复制代码
Queue<Action> taskQueue = new Queue<Action>();

// 添加任务
taskQueue.Enqueue(() => Console.WriteLine("Task A"));
taskQueue.Enqueue(() => Console.WriteLine("Task B"));

// 执行任务
while (taskQueue.Count > 0)
{
    Action nextTask = taskQueue.Dequeue();
    nextTask();
}

3.2任务调度

在消息队列系统中,消息作为对象被放入队列中,消费者从队首取出并处理。这种方式实现了生产者与消费者之间的解耦,支持异步通信和负载均衡。

csharp 复制代码
Queue<Message> messageQueue = new Queue<Message>();

// 生产者添加消息
messageQueue.Enqueue(new Message { Content = "Message 1" });

// 消费者处理消息
while (messageQueue.Count > 0)
{
    Message msg = messageQueue.Dequeue();
    ProcessMessage(msg);
}

3.3重试机制

在处理网络请求或数据库操作时,遇到暂时性故障时可将失败的请求放入重试队列,稍后再次尝试。如果重试成功,则移除请求;否则,将其放回队列等待下一轮重试。

csharp 复制代码
Queue<HttpRequest> retryQueue = new Queue<HttpRequest>();

// 请求失败时
retryQueue.Enqueue(failedRequest);

// 定期重试
while (retryQueue.Count > 0)
{
    HttpRequest requestToRetry = retryQueue.Dequeue();

    try
    {
        HttpResponse response = SendRequest(requestToRetry);
        if (response.IsSuccess)
        {
            // 处理成功响应,无需再重试
            continue;
        }
    }
    catch (Exception ex)
    {
        // 记录异常,准备下一次重试
    }

    // 重试失败,将请求放回队列
    retryQueue.Enqueue(requestToRetry);
}
相关推荐
雨颜纸伞(hzs)4 分钟前
C语言介绍
c语言·开发语言·软件工程
J总裁的小芒果6 分钟前
THREE.js 入门(六) 纹理、uv坐标
开发语言·javascript·uv
坊钰35 分钟前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
chenziang140 分钟前
leetcode hot100 LRU缓存
java·开发语言
时雨h1 小时前
RuoYi-ue前端分离版部署流程
java·开发语言·前端
云计算DevOps-韩老师1 小时前
【网络云计算】2024第52周-每日【2024/12/25】小测-理论&实操-自己构造场景,写5个系统管理的脚本-解析
开发语言·网络·云计算·bash·perl
暮色尽染1 小时前
Python 正则表达式
开发语言·python
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解GLSMOP1-GLSMOP9及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·算法·机器学习·matlab·强化学习
小爬虫程序猿1 小时前
利用Java爬虫获取速卖通(AliExpress)商品详情的详细指南
java·开发语言·爬虫
xlsw_1 小时前
java全栈day21--Web后端实战之利用Mybaits查询数据
java·开发语言