如何检查 Stack<T> 是不是为空
Posted
技术标签:
【中文标题】如何检查 Stack<T> 是不是为空【英文标题】:How to check if a Stack<T> is empty如何检查 Stack<T> 是否为空 【发布时间】:2014-11-03 03:03:48 【问题描述】:除了Stack<T>.Count() == 0
,还有其他方法可以检查Stack<T>
是否为空?
来自 C++/Java 背景,其中“堆栈”类通常具有某种专用的“为空”方法,例如 Java - Stack.empty。
【问题讨论】:
answers.yahoo.com/question/index?qid=20120403003525AAWPFlt 恕我直言,这是一种非常易读且有效的方式。所以不,我不知道更好的方法,因为Peek
不是一个选项。
我相信你可以使用Any
。 var notEmpty = stack.Any()
。需要明确的是,就像@TimSchmelter 在下面所说的那样,这不如使用Count
属性那么有效。
如果你真的想要 IsEmpty 或 Empty 那么你可以使用扩展方法,但这只是包装这个 Count == 0。我认为 Count 是完全可读的。
@AlexeiLevenkov:我可以为所有内容编写扩展。但在我看来,扩展有缺点,应该添加的不仅仅是简单的 Any to Count 翻译,这只是令人困惑。与其记住使用 Count 更好,不如记住必须使用扩展。
【参考方案1】:
不要使用.Count() == 0
,而是使用.Count == 0
。这是使用堆栈的属性而不是 linq 扩展方法。
【讨论】:
仅供参考:实际上这并不重要,因为Stack<T>
实现了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 > 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<T>
对象的快速、可读和标准方式。
【讨论】:
看看@StriplingWarrior提供的Benchmark以上是关于如何检查 Stack<T> 是不是为空的主要内容,如果未能解决你的问题,请参考以下文章
如何检查 <ng-content> 是不是为空? (到目前为止在 Angular 2+ 中)