简介
C# 中的 Queue
是一种基于链表的先进先出 (FIFO) 数据结构。
简单示例
以下是一个简单的 Queue
实例:
/// <summary>
/// 普通队列
/// </summary>
public void QueueShow()
{
// 创建一个Queue
Queue<string> queue = new Queue<string>();
// 添加元素到队列中
queue.Enqueue("Apple");
queue.Enqueue("Banana");
queue.Enqueue("Orange");
// 获取队列中的元素数量
int count = queue.Count;
Console.WriteLine("队列中的元素数量: " count);
// 检查队列是否为空
bool isEmpty = queue.Count == 0;
Console.WriteLine("队列是否为空: " isEmpty);
// 访问队列中的第一个元素(不移除)
string firstElement = queue.Peek();
Console.WriteLine("队列中的第一个元素: " firstElement);
// 移除并返回队列中的第一个元素
string removedElement = queue.Dequeue();
Console.WriteLine("被移除的元素: " removedElement);
// 遍历队列中的所有元素
Console.WriteLine("剩余的元素:");
foreach (var element in queue)
{
Console.WriteLine(element);
}
}
这个示例展示了如何使用C#中的Queue类。首先,我们创建了一个空的Queue对象。然后,使用Enqueue方法将元素添加到队列中。可以使用Count属性获取队列中的元素数量,并使用Peek方法访问队列中的第一个元素(但不移除)。使用Dequeue方法可以移除并返回队列中的第一个元素。最后,可以使用foreach循环遍历队列中的所有元素。
ConcurrentQueue<T>
是 .NET 中一个非常有用的类,它用于在多线程环境中安全地处理队列。下面是一个 ConcurrentQueue<T>
的基本示例:
/// <summary>
/// 线程安全队列
/// 如果多个线程同时操作一个队列推荐使用安全队列,因为有可能引起添加队列前数据都是正常的,当出队时数据是null的情况。
/// </summary>
public void ConcurrentQueueShow2()
{
// 创建一个 ConcurrentQueue 实例
ConcurrentQueue<int> queue = new ConcurrentQueue<int>();
// 启动一个任务来向队列中添加元素
Task.Run(() =>
{
for (int i = 0; i < 1000; i )
{
queue.Enqueue(i);
Task.Delay(10).Wait(); // 延迟10ms以模拟实际操作
}
});
// 启动另一个任务来从队列中取出元素
Task.Run(() =>
{
while (true)
{
int dequeue;
if (queue.TryDequeue(out dequeue))
{
Console.WriteLine("Dequeued: " dequeue);
}
Task.Delay(10).Wait(); // 延迟10ms以模拟实际操作
}
});
// 主线程等待任务完成
Console.ReadKey();
}
在这个示例中,我们创建了一个 ConcurrentQueue<int>
对象并启动了两个任务。一个任务向队列中添加元素,另一个任务从队列中取出元素。由于 ConcurrentQueue<T>
是线程安全的,所以这些操作可以在不同的线程上同时进行,而不需要担心竞争条件。