c# Queue 队列的基本使用
C# 中的 Queue
是一种基于链表的先进先出 (FIFO) 数据结构。以下是一个简单的 Queue
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /// <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>
的基本示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | /// <summary> /// 线程安全队列 /// </summary> public void ConcurrentQueueShow() { // 创建一个ConcurrentQueue ConcurrentQueue< string > queue = new ConcurrentQueue< string >(); // 添加元素到队列中 queue.Enqueue( "Apple" ); queue.Enqueue( "Banana" ); queue.Enqueue( "Orange" ); // 获取队列中的元素数量 int count = queue.Count; Console.WriteLine( "队列中的元素数量: " + count); // 检查队列是否为空 bool isEmpty = queue.IsEmpty; Console.WriteLine( "队列是否为空: " + isEmpty); // 尝试访问队列中的第一个元素(不移除) string firstElement; bool peekResult = queue.TryPeek( out firstElement); if (peekResult) { Console.WriteLine( "队列中的第一个元素: " + firstElement); } else { Console.WriteLine( "队列为空,无法访问第一个元素。" ); } // 尝试移除并返回队列中的第一个元素 string removedElement; bool dequeueResult = queue.TryDequeue( out removedElement); if (dequeueResult) { Console.WriteLine( "被移除的元素: " + removedElement); } else { Console.WriteLine( "队列为空,无法移除元素。" ); } // 遍历队列中的所有元素 Console.WriteLine( "剩余的元素:" ); foreach ( var element in queue) { Console.WriteLine(element); } } |
这个示例展示了如何使用C#中的ConcurrentQueue类。ConcurrentQueue是线程安全的队列,可以在多线程环境中进行并发访问。与普通的Queue类不同,ConcurrentQueue类没有Count属性,而是提供了IsEmpty属性来检查队列是否为空。ConcurrentQueue还提供了TryPeek和TryDequeue方法,用于尝试访问和移除队列中的元素,如果操作成功,则返回true,并将结果存储在输出参数中;如果队列为空,则返回false。可以使用foreach循环遍历ConcurrentQueue中的所有元素。请注意,在多线程环境中使用ConcurrentQueue时要小心处理竞态条件和线程安全性。
解决如果多个线程同时操作一个队列推荐使用安全队列,因为有可能引起添加队列前数据都是正常的,当出队时数据是null的情况。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | /// <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>
是线程安全的,所以这些操作可以在不同的线程上同时进行,而不需要担心竞争条件。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)