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

时间:2009-08-20 19:01:58

标签: c# .net vb.net collections queue

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

myQueue.Enqueue(newValue)
If myQueue.Count > specifiedSize Then myQueue.Dequeue()

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

Dim firstValue As Integer = myQueue.Peek()
Dim lastValue As Integer = myQueue.ToArray()(myQueue.Count - 1)
Dim diff As Integer = lastValue - firstValue

ToArray()的号召困扰了我,但是一个更好的选择并没有找到我。有什么建议吗?

5 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:13)

如果您需要快速访问列表中的第一项,那么您似乎使用了错误的数据结构。改为使用LinkedList,它可以方便地具有First和Last属性。

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

答案 2 :(得分:5)

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

    public new void Enqueue(T item)
    {
         Last = item;
         base.Enqueue(item);
    }
}

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

答案 3 :(得分:2)

您最好的选择是跟踪添加到Queue的最后一个值,然后使用myQueue.Peek()函数查看列表中的“第一个”(意思是下一个)项而不删除它

答案 4 :(得分:2)

可以使用双端队列( d ouble- e nded 队列)。

我不认为System.Collections(.Generic)中内置了一个,但这里有一些关于数据结构的信息。如果你实现了这样的东西,你可以使用PeekLeft()和PeekRight()来获取第一个和最后一个值。

当然,无论是否实现自己的双端队列都优于处理ToArray()的不一致,将取决于你。 :)

http://www.codeproject.com/KB/recipes/deque.aspx