为了账号安全,请及时绑定邮箱和手机立即绑定

固定大小队列,在新的enques上自动将旧值出列

固定大小队列,在新的enques上自动将旧值出列

C#
茅侃侃 2019-08-16 17:24:08
固定大小队列,在新的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)) ;
        }
     }
 }


查看完整回答
反对 回复 2019-08-16
?
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)) ;
        }
     }
 }


查看完整回答
反对 回复 2019-08-16
?
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);
        }
    }}


查看完整回答
反对 回复 2019-08-16
  • 3 回答
  • 0 关注
  • 483 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信