限制NET中Queue <T>的大小?
时间:2020-03-05 18:37:33 来源:igfitidea点击:
我有一个初始化为2的Queue <T>对象,但显然这只是该容量,并且在添加项目时一直在扩展。是否已经有一个对象,当达到限制时,该对象会自动使项目出队,或者是创建我自己的继承类的最佳解决方案?
解决方案
回答
我们为什么不只使用大小为2的数组?队列应该能够动态增长和收缩。
或者围绕Queue <T>实例的实例创建一个包装器类,每次使一个<T>对象排队时,检查队列的大小。如果大于2,则使第一个项目出队。
回答
我们应该创建自己的类,环形缓冲区可能会满足需求。
.NET中的数据结构允许我们指定容量(阵列除外),该数据结构用于构建用于保存内部数据的内部数据结构。
例如,对于列表,容量用于确定内部阵列的大小。当我们开始向列表中添加元素时,它将开始从索引0开始填充该数组,当其达到容量时,它将容量增加到新的更高容量,并继续进行填充。
回答
我已经找到了所需的基本版本,虽然它不是完美的,但是它会一直起作用,直到出现更好的情况为止。
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被编程为接口并被设计为子类。大多数公共方法是虚拟的,没有一个类是密封的。这样,我们将不必使用讨厌的" new"关键字,如果将" 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(); } } } }
我认为这段代码应该完全符合期望。