C# 队列(Queue)

C# 集合 C# 集合

在 C# 中,Queue 是一个先进先出(FIFO, First In First Out)数据结构。

Queue 属于 System.Collections 或 System.Collections.Generic 命名空间,分别提供非泛型和泛型版本的实现。Queue 适用于需要按照入队顺序处理数据的场景。

队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队

特性

  • 先进先出:最早加入队列的元素最先被移除。
  • 动态大小:队列的容量会根据需要动态调整。
  • 泛型支持:通过 Queue<T> 可以存储强类型的元素。
  • 线程安全Queue 本身不是线程安全的,但可以使用 ConcurrentQueue<T> 实现线程安全。

Queue 类的方法和属性

下表列出了 Queue 类的一些常用的 属性

属性名称类型描述
Countint获取队列中的元素个数。
SyncRootobject获取一个对象,用于同步对队列的访问(非泛型)。
IsSynchronizedbool指示队列的访问是否同步(线程安全,始终为 false)。

下表列出了 Queue 类的一些常用的 方法

方法名称返回类型描述
元素操作
Enqueue(object item)void将元素添加到队列的末尾。
Dequeue()object移除并返回队列开头的元素。
Peek()object返回队列开头的元素,但不移除。
Clear()void移除队列中的所有元素。
检查与复制
Contains(object item)bool确定某元素是否存在于队列中。
ToArray()object[]将队列中的元素复制到新数组中。
Clone()object创建当前队列的浅表副本。
CopyTo(Array array, int index)void将队列中的元素复制到现有数组,从指定索引开始。
枚举器支持
GetEnumerator()IEnumerator返回一个枚举器,用于循环访问队列中的元素。
线程安全
Synchronized(Queue queue)Queue返回一个线程安全的队列包装器。

实例

下面的实例演示了队列(Queue)的使用:

实例 1

using System;
using System.Collections;

class Program
{
    static void Main()
    {
        Queue queue = new Queue();

        // 添加元素
        queue.Enqueue("First");
        queue.Enqueue("Second");
        queue.Enqueue("Third");

        // 查看队首
        Console.WriteLine($"Peek: {queue.Peek()}"); // 输出:First

        // 移除元素
        Console.WriteLine($"Dequeue: {queue.Dequeue()}"); // 输出:First

        // 剩余元素
        foreach (var item in queue)
        {
            Console.WriteLine(item); // 输出:Second, Third
        }

        // 检查包含
        Console.WriteLine($"Contains 'Second': {queue.Contains("Second")}"); // 输出:True

        // 转数组
        object[] array = queue.ToArray();
        Console.WriteLine($"Array Length: {array.Length}"); // 输出:2
    }
}

实例 2

using System;
using System.Collections;

namespace CollectionsApplication
{
   class Program
   {
      static void Main(string[] args)
      {
         Queue q = new Queue();

         q.Enqueue('A');
         q.Enqueue('M');
         q.Enqueue('G');
         q.Enqueue('W');
         
         Console.WriteLine("Current queue: ");
         foreach (char c in q)
            Console.Write(c + " ");
         Console.WriteLine();
         q.Enqueue('V');
         q.Enqueue('H');
         Console.WriteLine("Current queue: ");        
         foreach (char c in q)
            Console.Write(c + " ");
         Console.WriteLine();
         Console.WriteLine("Removing some values ");
         char ch = (char)q.Dequeue();
         Console.WriteLine("The removed value: {0}", ch);
         ch = (char)q.Dequeue();
         Console.WriteLine("The removed value: {0}", ch);
         Console.ReadKey();
      }
   }
}

当上面的代码被编译和执行时,它会产生下列结果:

Current queue: 
A M G W 
Current queue: 
A M G W V H 
Removing values
The removed value: A
The removed value: M

C# 集合 C# 集合