除了 Stack<T>.Count() == 0
这种方式,是否有其他方法可以检查 Stack<T>
是否为空?
来自 C++/Java 背景的开发者通常会使用类似于 Java - Stack.empty 的专用“是否为空”方法。
除了 Stack<T>.Count() == 0
这种方式,是否有其他方法可以检查 Stack<T>
是否为空?
来自 C++/Java 背景的开发者通常会使用类似于 Java - Stack.empty 的专用“是否为空”方法。
不要使用.Count() == 0
,而是直接使用.Count == 0
。这样可以使用堆栈的属性而不是linq扩展方法。
Stack<T>
实现了 ICollection
接口,在这种情况下,Enumerable.Count
简单地使用了 Count
属性。 - Dirk有三种常见的方法,使用哪一种通常是品味问题。
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
慢一个数量级。我的初始评估没有改变。
namespace System.Collection.Generic {
public static class SystemEx {
public static bool IsEmpty<T>(this Stack<T> stack) {
return (stack.Count==0);
}
}
stack.Any()
。这是对于所有 IEnumerable<T>
对象来说,快速、易读和标准的方法。Any()
是“最快”的。但它足够快。Count == 0
只适用于IList
,对我来说不够通用。Count() == 0
是最糟糕的,因为它不仅速度慢,而且是O(n),而Count==0
和Any()
是O(1)。
但是Any()
既通用又足够快。如果你需要最快的选项,比如游戏开发,那么...我想你需要用C++。如果你正在开发服务器端,例如拥有合理计算能力的情况下,Any()
是你的朋友,我个人认为。 - undefined
Any
。var notEmpty = stack.Any()
。要明确的是,就像下面@TimSchmelter所说的那样,这不如使用Count
属性有效率。 - Neil Smith