【问题标题】:How would you obtain the first and last items in a Queue?您将如何获得队列中的第一个和最后一个项目?
【发布时间】:2010-11-21 10:42:36
【问题描述】:

假设我有一个滚动的值集合,我在其中指定集合的​​大小,并且任何时候添加新值,超过此指定大小的任何旧值都会被丢弃。显然(并且我已经对此进行了测试)用于此行为的最佳集合类型是队列:

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

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

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

打电话给ToArray() 让我很困扰,但我并没有找到更好的选择。有什么建议吗?

【问题讨论】:

  • C# 没有 Dequeue 类型吗?
  • 不,C# 没有任何类型,.Net 是有类型的; .Net 没有 Dequeue 类型,它有一个 Queue/Queue 类型,它有一个 Dequeue 方法。

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


【解决方案1】:

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

【讨论】:

  • 大约在您提供此答案的同时,我意识到解决方案(基本上是您所建议的)将是多么简单。好电话!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    可以使用双端队列(double-ended queue)。

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

    当然,实现自己的双端队列是否比处理 ToArray() 的不性感更可取取决于您。 :)

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 不幸但比跟踪最后添加到数据结构本身之外更好。
      【解决方案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 属性之类的事情。但这对于基本概念来说应该足够了。

      【讨论】:

      • 哈!这几乎是我刚刚写的代码。 (唯一的区别是类名,我把 Last = item 放在 base.Enqueue(item) 之后)。
      • 当最后一个元素被移除时会发生什么?那么如何将Last 设置为倒数第二个元素?
      猜你喜欢
      • 2013-11-09
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      相关资源
      最近更新 更多