如何在.NET中限制Queue <T>的大小?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (37)

我有一个Queue <T>对象,我已经初始化为2的容量,但显然这只是容量,并且随着我添加项目而不断扩大。是否已经有一个对象在达到限制时自动将项目出列,或者是创建自己的继承类的最佳解决方案?

提问于
用户回答回答于

我已经想出了一个基本版本的我正在寻找的东西,它并不完美,但它会做好工作,直到有更好的出现。

public class LimitedQueue<T> : Queue<T>
{
    public int Limit { get; set; }

    public LimitedQueue(int limit) : base(limit)
    {
        Limit = limit;
    }

    public new void Enqueue(T item)
    {
        while (Count >= Limit)
        {
            Dequeue();
        }
        base.Enqueue(item);
    }
}
用户回答回答于

我会建议你拉起C5库。与SCG(System.Collections.Generic)不同,C5被编程为接口并被设计为子类。大多数公共方法都是虚拟的,没有一个类是封闭的。这样,你就不必使用这个恶意的“新”关键字,如果你LimitedQueue<T>被投射到一个不会触发的关键字SCG.Queue<T>。使用C5并使用与以前相同的代码,可以从中得出结论CircularQueue<T>。在CircularQueue<T>实际实现既堆栈和队列,这样你就可以得到几乎免费的限制这两个选项。我用下面的3.5个结构重写了它:

using C5;

public class LimitedQueue<T> : CircularQueue<T>
{
    public int Limit { get; set; }

    public LimitedQueue(int limit) : base(limit)
    {
        this.Limit = limit;
    }

    public override void Push(T item)
    {
        CheckLimit(false);
        base.Push(item);
    }

    public override void Enqueue(T item)
    {
        CheckLimit(true);
        base.Enqueue(item);
    }

    protected virtual void CheckLimit(bool enqueue)
    {
        while (this.Count >= this.Limit)
        {
            if (enqueue)
            {
                this.Dequeue();
            }
            else
            {
                this.Pop();
            }
        }
    }
}

我认为这段代码应该完全符合你的要求。

扫码关注云+社区