首页 > 编程语言 >c# Queue 队列的基本使用

c# Queue 队列的基本使用

时间:2023-10-18 16:37:27浏览次数:38  
标签:queue Console c# 元素 Queue 队列 WriteLine ConcurrentQueue

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>
        /// 线程安全队列
        /// </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的情况。

/// <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> 是线程安全的,所以这些操作可以在不同的线程上同时进行,而不需要担心竞争条件。

标签:queue,Console,c#,元素,Queue,队列,WriteLine,ConcurrentQueue
From: https://www.cnblogs.com/wjygxjz/p/17772666.html

相关文章

  • WinSCP 脚本实现将 jar 包一键上传 Ubuntu 并 docker 部署
    准备首先,在Ubuntu写一个.sh脚本用于自动更新jar包的docker容器和镜像,然后在Windows写一个.bat脚本用于上传jar包并运行.sh脚本。deploy.sh#Kill容器dockerkilldemo#删除容器dockerrmdemo#删除镜像dockerrmimy/demo#构建镜像dockerbuild-t......
  • CSS-04
    定位将盒子定在一固定位置组成定位模式+边偏移定位模式static-静态定位(标准流)(相当于无定位)relative-相对absolute-绝对(脱标)fixed-固定(脱标)相对定位相对位置position:relative;​top:100px;相对自己的位置移动,原位置保留绝对定位相对祖先的位置移动没有......
  • Go - Creating Subtests to Have Finer Control Over Groups of Test Cases
    Problem: Youwanttocreatesubtestswithinatestfunctiontohavefinercontrolovertestcases.Solution: Usethet.Runfunctiontocreatesubtestswithinatestfunction.Subtestsextendtheflexibilityoftestfunctionstoanotherleveldown. When......
  • RX66T优化用于电机控制R5F566TFFGFP、R5F566TKGGFP、R5F566TKCGFP搭载第三代RXv3 CPU
    1、RX66T 框图2、描述RX66T32位MCU是基于第三代RXv3CPU内核的旗舰32位RXMCU系列中的首款产品。这些MCU优化用于电机控制,可满足实时性能和增强稳定性要求。这些特性帮助实现下一代智能工厂设备和智能家电中的逆变器控制。这些MCU还具有下一代设计中嵌入式AI所需的额外处理能......
  • 【JAVA】cron定时怎么记 ss mi hh DD MM 星期 YY
      ......
  • c的基本语法
    逻辑运算&&和||的短路应当注意到,这两个运算符的两端会优先计算左端,如果左端结果将使结果确定,那么就不执行右端语句。&&和||的计算优先度&&的计算优先度更高,但二者的计算优先度均低于&和|。但如果||和&&同时存在,且||的一端为&&运算结果,当出现||的另一端结果为1,将不执行&&两端......
  • pytorch 量化相关参考
    ref:https://blog.csdn.net/znsoft/article/details/130788437importtorchimporttorch.quantizationclassM(torch.nn.Module):def__init__(self):super(M,self).__init__()self.quant=torch.quantization.QuantStub()#静态量化时量化桩......
  • kubeadm init 报错ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables
    现象:[ERRORFileContent--proc-sys-net-bridge-bridge-nf-call-iptables]:/proc/sys/net/bridge/bridge-nf-call-iptablescontentsarenotsetto1原因:  /proc/sys/net/bridge/bridge-nf-call-iptables 文件的内容并没有设置为1解决方案echo"1">/proc/sys/net/br......
  • mysql 运行没错,在mybatis中报错 druid 报错 syntax error, expect RPAREN, actual
    您遇到的问题可能是由于Druid版本较旧导致的。在Druid 1.0.19中,对于某些语法结构的处理存在一些限制和问题。针对您的具体情况,可以尝试以下解决方案:1. 确保SQL语句的括号匹配正确。错误消息"expect RPAREN, actual IDENTIFIER DAY"表明Druid期望一个右括号(RPAREN),但实际上......
  • 使用腾讯云 Cloud studio 实现调度百度AI实现文字识别
    前言今天我们也来高大上一下,玩一把人工智能。那就是免费调用百度AI实现图片上面的文字识别。相对于Python的第三方库,百度人工智能要更强大,毕竟人工智能不是那么容易搞的。要调用,其实很简单,关键的代码只需要三行。但需要先注册百度AI,获得ID和密钥。注册也很简单,百度AI社区有详细......