你如何获得队列中的第一个和最后一个项目?

Dan*_*Tao 8 .net c# vb.net queue collections

假设我有一个滚动的值集合,我指定集合的​​大小,并且每当添加新值时,超出此指定大小的任何旧值都将被删除.显然(我已经测试了这个)用于此行为的最佳集合类型是队列:

myQueue.Enqueue(newValue)
If myQueue.Count > specifiedSize Then myQueue.Dequeue()
Run Code Online (Sandbox Code Playgroud)

但是,如果我想计算队列中第一个和最后一个项目之间的差异怎么办?显然我无法通过索引访问项目.但是,从队列切换到实现IList的东西看起来有点矫枉过正,就像写一个新的类Queue类一样.现在我有:

Dim firstValue As Integer = myQueue.Peek()
Dim lastValue As Integer = myQueue.ToArray()(myQueue.Count - 1)
Dim diff As Integer = lastValue - firstValue
Run Code Online (Sandbox Code Playgroud)

那个叫ToArray()我困扰的电话,但是一个更好的选择不会来找我.有什么建议?

mur*_*d99 16

你可以做的一件事就是有一个临时变量来存储刚刚入队的值,因为这将是最后一个值,因此可以访问该变量来获取该值.


Jul*_*iet 13

对我来说,如果您需要快速访问列表中的第一项,那么您使用的是错误的数据结构.切换一个LinkedList,它方便地具有First和Last属性.

请确保仅使用AddLast和RemoveFirst向链接列表添加和删除项目以维护Queue属性.为防止自己无意中违反Queue属性,请考虑在链接列表周围创建一个包装类,并仅显示队列中所需的属性.


xan*_*ont 5

public class LastQ<T> : Queue<T>
{
    public T Last { get; private set; }

    public new void Enqueue(T item)
    {
         Last = item;
         base.Enqueue(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:显然,这个基本类应该更加健壮,可以保护空队列中的Last属性.但这应该足够基本的想法.