【问题标题】:How to check if a Stack<T> is empty如何检查 Stack<T> 是否为空
【发布时间】:2014-11-03 03:03:48
【问题描述】:

除了Stack&lt;T&gt;.Count() == 0,还有其他方法可以检查Stack&lt;T&gt; 是否为空?

来自 C++/Java 背景,其中“堆栈”类通常具有某种专用的“为空”方法,例如 Java - Stack.empty

【问题讨论】:

  • 恕我直言,这是一种非常易读且有效的方式。所以不,我不知道更好的方法,因为Peek 不是一个选项。
  • 我相信你可以使用Anyvar notEmpty = stack.Any()。需要明确的是,就像@TimSchmelter 在下面所说的那样,这不如使用Count 属性那么有效。
  • 如果你真的想要 IsEmpty 或 Empty 那么你可以使用扩展方法,但这只是包装这个 Count == 0。我认为 Count 是完全可读的。
  • @AlexeiLevenkov:我可以为所有内容编写扩展。但在我看来,扩展有缺点,应该添加的不仅仅是简单的 Any to Count 翻译,这只是令人困惑。与其记住使用 Count 更好,不如记住必须使用扩展。

标签: c# stack is-empty


【解决方案1】:

不要使用.Count() == 0,而是使用.Count == 0。这是使用堆栈的属性而不是 linq 扩展方法。

【讨论】:

  • 仅供参考:实际上这并不重要,因为Stack&lt;T&gt; 实现了ICollection,在这种情况下Enumerable.Count 也只使用Count 属性。
【解决方案2】:

共有三种常见的方法,您使用哪一种通常是个人喜好问题。

if(!stack.Any()) ...
if(stack.Count() == 0) ...
if(stack.Count == 0) ...

剖析不同的方法looks like this

.Any().Count().Count... 花费 10 到 20 倍的时间,并且仍然可以每毫秒运行数万次。毫秒。所以.Count &gt; 0 是“快得多”,但其他人仍然足够快,在大多数情况下不必担心。我个人会坚持使用Any(),因为我觉得它读起来更好,但我不会因为选择Count 而对任何人感到不满。

【讨论】:

  • 感谢您的回答,尤其是基准测试。 :-) 目前正在编写一个编译器,所以对我来说性能很重要。
【解决方案3】:

您也可以创建自己的扩展方法

namespace System.Collection.Generic {
   public static class SystemEx {
        public static bool IsEmpty<T>(this Stack<T> stack) {
            return (stack.Count==0);
        }    
   }

【讨论】:

  • 有些扩展是多余的。这是其中之一。它只是隐藏了并不复杂的实现。所以我们总是要看看这个方法到底为什么存在,也许有一个重要的细节。
  • 我同意你的观点,但我们不讨论是否方便,只讨论其他方式。 ;)
【解决方案4】:

您可以使用stack.Any()。所有IEnumerable&lt;T&gt; 对象的快速、可读和标准方式。

【讨论】:

  • 看看@StriplingWarrior提供的Benchmark
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多