如何检查 Stack 是否为空
如何检查 Stack 是否为空
除了 Stack
这种方式之外,还有其他的方法可以检查一个 Stack
是否为空吗?\n我来自于 C++/Java 的背景,那里的 \"stack\" 类通常有一些专门的 \"是否为空\" 方法,比如 Java - Stack.empty。
如何检查Stack
有三种常见的方法,使用哪种方法通常是一种个人喜好。
if (!stack.Any()) ... if (stack.Count() == 0) ... if (stack.Count == 0) ...
对这些不同的方法进行性能测试,结果如下图所示:

.Any()和.Count()的执行时间是.Count的10倍到20倍,并且在每毫秒内仍然可以执行数万次。所以.Count > 0的速度"要快得多",但是在大多数情况下,其他方法的速度仍然足够快,不需要过多担心。我个人喜欢使用.Any(),因为我觉得它的可读性更好,但是我不会对选择Count的人有任何异议。
更新
在打开优化的.NET 6中运行相同的LINQPad脚本后,发现!stack.Any()实际上比stack.Count() == 0更快,尽管它的速度仍然比stack.Count == 0慢一个数量级。我的初步评估保持不变。

感谢这个答案,特别是性能测试。:-) 我正在编写一个编译器,所以性能对我来说很重要。
使用Stack
该扩展方法是在System.Collection.Generic命名空间下的SystemEx类中定义的。它接受一个类型为Stack
尽管可以使用堆栈的自带方法IsEmpty()来检查堆栈是否为空,但有时我们可能想要自定义扩展方法来实现相同的功能。这可能是因为我们想要隐藏实现细节,或者因为我们认为自定义方法更加方便。
总结起来,以上代码展示了如何创建一个扩展方法来检查堆栈是否为空。这个扩展方法是在System.Collection.Generic命名空间下的SystemEx类中定义的,它接受一个类型为Stack
使用.Count() == 0
来判断一个Stack
是否为空,可以改为使用.Count == 0
。这样做是使用了堆栈的属性而不是linq扩展方法。\n只是为了提供信息:实际上这并没有太大的影响,因为Stack<T>
实现了ICollection
,在这种情况下,Enumerable.Count
简单地使用了Count
属性。\n我认为.Count
比.Count()
更快。可以查看回答来证明。