如何检查 Stack<T> 是不是为空

Posted

技术标签:

【中文标题】如何检查 Stack<T> 是不是为空【英文标题】: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。

【问题讨论】:

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

以上是关于如何检查 Stack<T> 是不是为空的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Flux<Object> 是不是为空?

如何检查 <ng-content> 是不是为空? (到目前为止在 Angular 2+ 中)

如何检查 MySQL php 中的列是不是为空?

使用 LINQ 检查列表是不是为空

如何检查 IQueryable<T>.Element 类型是不是为接口

我应该如何检查 Stream<T> 是不是已排序?