固定大小队列,在新的enques上自动将旧值出列我正在使用ConcurrentQueue共享数据结构,其目的是保存传递给它的最后N个对象(历史类型)。假设我们有一个浏览器,我们希望最后100个浏览Urls。我想要一个队列,当容量变满时(历史中的100个地址),当新条目插入(入队)时自动丢弃(出列)最旧的(第一个)条目。我怎样才能实现这个目标System.Collections?
3 回答
ABOUTYOU
TA贡献1812条经验 获得超5个赞
我会编写一个包装类,在Enqueue上检查Count,然后在计数超过限制时Dequeue。
public class FixedSizedQueue<T> { ConcurrentQueue<T> q = new ConcurrentQueue<T>(); private 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)) ; } } }
SMILET
TA贡献1796条经验 获得超4个赞
我会编写一个包装类,在Enqueue上检查Count,然后在计数超过限制时Dequeue。
public class FixedSizedQueue<T> { ConcurrentQueue<T> q = new ConcurrentQueue<T>(); private 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)) ; } } }
FFIVE
TA贡献1797条经验 获得超6个赞
对于任何发现它有用的人,这里有一些基于Richard Schneider的答案的工作代码:
public class FixedSizedQueue<T>{ readonly ConcurrentQueue<T> queue = new ConcurrentQueue<T>(); public int Size { get; private set; } public FixedSizedQueue(int size) { Size = size; } public void Enqueue(T obj) { queue.Enqueue(obj); while (queue.Count > Size) { T outObj; queue.TryDequeue(out outObj); } }}
- 3 回答
- 0 关注
- 483 浏览
添加回答
举报
0/150
提交
取消