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

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

我正在使用ConcurrentQueue共享数据结构,其目的是保存传递给它的最后N个对象(历史类型)。

假设我们有一个浏览器,我们希望最后100个浏览Urls。我想要一个队列,当容量变满时(历史中的100个地址),当新条目插入(入队)时自动丢弃(出列)最旧的(第一个)条目。

我怎样才能实现这个目标System.Collections


茅侃侃
浏览 484回答 3
3回答

ABOUTYOU

我会编写一个包装类,在Enqueue上检查Count,然后在计数超过限制时Dequeue。&nbsp;public&nbsp;class&nbsp;FixedSizedQueue<T> &nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConcurrentQueue<T>&nbsp;q&nbsp;=&nbsp;new&nbsp;ConcurrentQueue<T>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;object&nbsp;lockObject&nbsp;=&nbsp;new&nbsp;object(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;Limit&nbsp;{&nbsp;get;&nbsp;set;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;Enqueue(T&nbsp;obj) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.Enqueue(obj); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock&nbsp;(lockObject) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;overflow; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(q.Count&nbsp;>&nbsp;Limit&nbsp;&&&nbsp;q.TryDequeue(out&nbsp;overflow))&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;}

SMILET

我会编写一个包装类,在Enqueue上检查Count,然后在计数超过限制时Dequeue。&nbsp;public&nbsp;class&nbsp;FixedSizedQueue<T> &nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConcurrentQueue<T>&nbsp;q&nbsp;=&nbsp;new&nbsp;ConcurrentQueue<T>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;object&nbsp;lockObject&nbsp;=&nbsp;new&nbsp;object(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;Limit&nbsp;{&nbsp;get;&nbsp;set;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;Enqueue(T&nbsp;obj) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.Enqueue(obj); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lock&nbsp;(lockObject) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;overflow; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(q.Count&nbsp;>&nbsp;Limit&nbsp;&&&nbsp;q.TryDequeue(out&nbsp;overflow))&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;}

FFIVE

对于任何发现它有用的人,这里有一些基于Richard Schneider的答案的工作代码:public&nbsp;class&nbsp;FixedSizedQueue<T>{ &nbsp;&nbsp;&nbsp;&nbsp;readonly&nbsp;ConcurrentQueue<T>&nbsp;queue&nbsp;=&nbsp;new&nbsp;ConcurrentQueue<T>(); &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;Size&nbsp;{&nbsp;get;&nbsp;private&nbsp;set;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;FixedSizedQueue(int&nbsp;size) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Size&nbsp;=&nbsp;size; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;Enqueue(T&nbsp;obj) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.Enqueue(obj); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(queue.Count&nbsp;>&nbsp;Size) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;outObj; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue.TryDequeue(out&nbsp;outObj); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP