Skip to content

Queue

csharp-queue-deep-dive

Queue 是什么

Queue<T> 是“队列”,特点是:先进先出,英文叫 FIFO,First In, First Out。

你可以把它想象成排队买奶茶:先排队的人先买到,后来的人站到队尾。

c
using System.Collections.Generic;

Queue<string> jobs = new Queue<string>();

jobs.Enqueue("Load");
jobs.Enqueue("Spawn");
jobs.Enqueue("Save");

Debug.Log(jobs.Dequeue()); // Load
Debug.Log(jobs.Dequeue()); // Spawn
Debug.Log(jobs.Dequeue()); // Save

核心操作

Enqueue:入队,放到队尾。 Dequeue:出队,取出并移除队首。 Peek:查看队首,但不移除。 Count:当前有几个元素。 Clear:清空队列。

c
Queue<int> queue = new();

queue.Enqueue(10);
queue.Enqueue(20);

int first = queue.Peek();    // 10,还在队列里
int outOne = queue.Dequeue(); // 10,被移除了

一定要防空队列

如果队列是空的,直接 Dequeue()Peek() 会报错。

c
if (queue.Count > 0)
{
    int value = queue.Dequeue();
}

如果你的 Unity / .NET 版本支持,也可以用更安全的:

c
if (queue.TryDequeue(out int value))
{
    Debug.Log(value);
}

Unity 里常见用法

任务队列:把生成怪物、加载资源、寻路请求排起来,每帧处理一部分,避免瞬间卡顿。

c
Queue<System.Action> tasks = new Queue<System.Action>();

void Update()
{
    int maxPerFrame = 3;
    int count = 0;

    while (tasks.Count > 0 && count < maxPerFrame)
    {
        System.Action task = tasks.Dequeue();
        task.Invoke();
        count++;
    }
}

对象池也常用 Queue:空闲对象排队,需要时取一个,用完再放回去。

c
Queue<GameObject> pool = new Queue<GameObject>();

GameObject Get()
{
    if (pool.Count > 0)
        return pool.Dequeue();

    return Instantiate(prefab);
}

void Release(GameObject obj)
{
    obj.SetActive(false);
    pool.Enqueue(obj);
}

Queue vs Stack vs List

Queue<T>:先进先出,适合任务、消息、对象池。 Stack<T>:后进先出,适合撤销、回退、状态栈。 List<T>:按下标访问,适合遍历、排序、随机访问。

常见坑

Queue 没有 queue[0] 这种下标访问。 foreach 遍历时不要 EnqueueDequeue 当前队列。 需要按顺序处理并移除元素时,用 while + Dequeue

参考链接Microsoft QueueQueue.EnqueueQueue.DequeueQueue.PeekQueue.TryDequeueMicrosoft StackUnity Script Serialization Rules

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0