首页 >后端开发 >C++ >如何在C#中实现固定大小的队列并自动出队?

如何在C#中实现固定大小的队列并自动出队?

Patricia Arquette
Patricia Arquette原创
2025-01-13 11:57:44200浏览

How to Implement a Fixed-Sized Queue with Automatic Dequeueing in C#?

C# 中实现具有自动出队功能的固定大小队列

在软件开发中,管理有限的存储容量同时保留必要信息至关重要。处理队列时,经常会遇到这种情况:不断添加新数据,当达到容量限制时需要丢弃旧数据。为了解决这个问题,我们使用 System.Collections 命名空间中的 ConcurrentQueue<T> 类提供一个解决方案。

实现带出队功能的固定大小队列

要创建一个具有自动出队功能的固定大小队列,我们定义一个包装类 FixedSizedQueue<T>,它在内部封装了一个 ConcurrentQueue<T>

<code class="language-csharp">public class FixedSizedQueue<T>
{
    private readonly ConcurrentQueue<T> q = new ConcurrentQueue<T>();
    private readonly object lockObject = new object();

    public int Limit { get; set; }
    public void Enqueue(T obj)
    {
        q.Enqueue(obj);
        lock (lockObject)
        {
            T overflow;
            while (q.Count > Limit && q.TryDequeue(out overflow)) ;
        }
    }
}</code>

解释

FixedSizedQueue<T> 类提供了一个单一方法 Enqueue,用于向队列添加元素。在内部,它检查队列的计数是否超过指定的 Limit。如果是,则使用 lock 语句锁定队列,并出队元素,直到计数低于限制。

这种机制确保队列中始终只存储所需数量的元素。最旧的元素会自动删除以容纳较新的元素。

使用示例

要使用 FixedSizedQueue<T> 类,请创建一个实例并将 Limit 属性设置为所需的最高容量:

<code class="language-csharp">FixedSizedQueue<string> browserHistory = new FixedSizedQueue<string> { Limit = 100 };</code>

之后,只需调用 Enqueue 方法即可向历史记录添加新元素:

<code class="language-csharp">browserHistory.Enqueue("www.google.com");</code>

当您添加更多 URL 时,最旧的 URL 将自动出队,从而保持历史记录中 100 个 URL 的所需容量。

以上是如何在C#中实现固定大小的队列并自动出队?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn