c# Queue 队列的基本使用

这篇具有很好参考价值的文章主要介绍了c# Queue 队列的基本使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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> 是线程安全的,所以这些操作可以在不同的线程上同时进行,而不需要担心竞争条件。文章来源地址https://www.toymoban.com/news/detail-711489.html

到了这里,关于c# Queue 队列的基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】队列(queue)的使用

    C++ 中, std::queue 容器是一种 先进先出 (First In First Out, FIFO)的数据结构,且有两个出口。 队列(queue)的 结构 如下:类似于生活中的排队买票,最先排队的人位于队伍最前端,后来的人依次从队伍末尾加入队伍。当队首的人买票成功后离开,原先位于第二位的人顶上成为新的队

    2024年02月09日
    浏览(40)
  • C++ 优先队列 priority_queue 使用篇

    目录 1.储备知识    (1)数据结构:堆   (2)仿函数(函数对象)     [1]理解仿函数     [2]实现仿函数   (3)priority_queue理解     [1]什么是priority_queue (优先队列)?     [2]优先队列性质 2.priority_queue的参数理解(重要!!!)   (1)priority_queue的参数     [1]priority_queue类模板参数     [

    2024年03月12日
    浏览(84)
  • C++——优先级队列(priority_queue)的使用及实现

    目录 一.priority_queue的使用 1.1、基本介绍 1.2、优先级队列的定义 1.3、基本操作(常见接口的使用) 1.4、重写仿函数支持自定义数据类型 二.priority_queue的模拟实现 2.1、构造重要的调整算法 2.2、常见接口的实现 push() pop() top() empty()、size()  三.利用仿函数改进调整算法 我们之前

    2024年02月02日
    浏览(43)
  • 【C++】栈和队列(stack and queue)语法使用及实现原理

         本篇文章会对C++中的容器stack和queue用法进行详解,也包含对优先队列(priority_queue)的讲解。同时会模拟实现stack、queue和priority_queue底层。希望本篇文章会对你有所帮助! 目录 一、stack 栈 1、1 什么是适配器 1、2 stack 语法讲解 1、3 stack 底层实现 1、4 deque 双端队列简单

    2024年02月15日
    浏览(43)
  • C#的Queue 类使用说明

    1)表示对象的 先进先出集合 。 2)当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。 构造函数 构造函数说明 Hashtable() 使用默认的 初始容量、加载因子、哈希代码 提供程序和比较器来初始化 H

    2023年04月24日
    浏览(20)
  • C++ 栈和队列(stack and queue)语法使用及底层实现原理

         本篇文章会对C++中的容器stack和queue用法进行详解,也包含对优先队列(priority_queue)的讲解。同时会模拟实现stack、queue和priority_queue底层。希望本篇文章会对你有所帮助! 目录 一、stack 栈 1、1 什么是适配器 1、2 stack 语法讲解 1、3 stack 底层实现 1、4 deque 双端队列简单

    2024年02月13日
    浏览(39)
  • 【C++】STL使用仿函数控制优先级队列priority_queue

    本文章讲解C++STL的容器适配器:priority_queue的实现,并实现仿函数控制priority_queue底层。 priority_queue叫做优先级队列,它的底层结构是堆,在库中,默认生成的是大堆 在库的实现中,使用vector作为该优先级队列的适配容器。 由于priority_queue也是一个适配器,所以它的接口函数

    2024年02月16日
    浏览(48)
  • 【STL】priority_queue(优先级队列)详解及仿函数使用(附完整源码)

    1. priority_queue介绍和使用 1.1 priority_queue介绍 优先级队列也是在 queue 里: 因此和 queue 一样, priority_queue 也是一个容器适配器。priority_queue官方文档 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 类似于堆,在堆中可以随

    2024年02月08日
    浏览(42)
  • C#中的栈与队列/练习

    用双向链表实现一个队列 使用双向链表实现栈

    2024年02月08日
    浏览(36)
  • 【STL】stack、queue基本使用和模拟实现

    目录 前言 stack 接口介绍 模拟实现 queue 接口介绍 模拟实现 没有迭代器  deque介绍 stack 和 queue 本质上是一种容器配接器,就像我们平时充电时使用的电源适配器,能够将电压转换成设备能够接受的程度。 其通过封装特定容器作为其底层容器的类,通过一组特定的成员函数来

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包