【问题标题】:How can I check if a Queue is empty?如何检查队列是否为空?
【发布时间】:2011-12-19 14:20:26
【问题描述】:

在 C# 中,如何检查队列是否为空?

我想遍历队列的元素,我需要知道何时停止。我怎样才能做到这一点?

【问题讨论】:

  • 您使用哪个队列?请发布队列定义。

标签: c# queue is-empty


【解决方案1】:

TryPeek() 会让你检查 Queue 是否有元素。

Queue q = new Queue();
if (!q.TryPeek(out object i)) {
    /* Queue is empty */
    ....
}

【讨论】:

    【解决方案2】:

    YourQueue.GetEnumerator().MoveNext() == true

    【讨论】:

      【解决方案3】:

      我建议使用 Any() 方法,因为这不会对整个队列进行计数,这在性能方面会更好。

      Queue myQueue = new Queue();
          if(myQueue.Any()){
            //queue not empty
          }
      

      【讨论】:

      • @GregoryBad: myQueue.Count 不会对整个队列进行计数。大小存储在 Queue 类中的私有变量中,Count 属性只返回该变量,请参阅Queue<T>.Count Property。您指的 Count 是 linq 命名空间中的 Count() 。 Enumerable.Count
      • @Rutix,谢谢。很高兴知道。
      • @Rutix 甚至对 Enumerable.Count() 方法进行了优化,以检查它是否可以强制转换为 ICollection 并在不枚举的情况下返回 .Count 属性。
      • @AndrewPalmer 现在确实是 ;)。我不知道当我 3 年前发表评论时该优化是否已经到位:)。
      【解决方案4】:
          Queue test = new Queue();
          if(test.Count > 0){
            //queue not empty
          }
      

      【讨论】:

        【解决方案5】:

        有一个扩展方法 .Count() 可用,因为 Queue 实现了 IEnumerable。

        你也可以做_queue.Any()看看里面有没有元素。

        【讨论】:

        • 第二个很糟糕,第一个很糟糕。使用 queue.Count 属性。
        【解决方案6】:

        你可以检查它的 Count 属性是否等于 0。

        【讨论】:

          【解决方案7】:

          假设您的意思是Queue&lt;T&gt;,您可以使用:

          if (queue.Count != 0)
          

          但是为什么要麻烦呢?无论如何都要遍历它,如果它是空的,你将永远不会进入正文:

          Queue<string> queue = new Queue<string>();
          
          // It's fine to use foreach...
          foreach (string x in queue)
          {
              // We just won't get in here...
          }
          

          【讨论】:

          • 注意,如果您在处理队列时需要将任何项目添加到队列中(例如,如果您正在实施 BFS 算法),则 foreach 方法不起作用,因为这样枚举器将失效。对于这种情况,使用 Count 属性是正确的方法。
          • @DSO 如果您要从队列中删除项目,枚举器是否也会失效?
          • 如果你不通过 Dequeue 移除元素,那么使用 Queue 有什么意义呢?
          • @Jakotheshadows,在 OP 的问题中,他没有从队列中删除项目,他只是在迭代队列中的内容。恕我直言,队列的使用相当奇怪。 (作为titol cmets,如果你没有需要Dequeue的情况,那你为什么要使用队列?)
          • @ToolmakerSteve:是 OP 说他们想要遍历队列,但从未提及从中删除任何内容。我只是在回答被问到的问题......
          【解决方案8】:

          假设你的意思是System.Collections.Generic.Queue&lt;T&gt;

          if(yourQueue.Count != 0) { /* Whatever */ }
          

          应该可以解决问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-02
            • 1970-01-01
            • 2021-02-01
            • 2012-09-14
            • 2018-04-26
            • 1970-01-01
            相关资源
            最近更新 更多