假设我有一个滚动的值集合,其中我指定了集合的大小,并且每当添加新值时,超出此指定大小的任何旧值都将被删除。显然(我已经测试了这个)用于此行为的最佳集合类型是队列:
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()
的号召困扰了我,但是一个更好的选择并没有找到我。有什么建议吗?
答案 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()的不一致,将取决于你。 :)