空哈希集-计数与任意
本文关键字:任意 哈希集 | 更新日期: 2023-09-27 18:27:36
我只想知道HashSet hs
是否为空。我不想知道它到底包含了多少元素。
所以我可以使用这个:
bool isEmpty = (hs.Count == 0);
或者这个:
bool isEmpty = hs.Any(x=>true);
哪一个在性能方面提供了更好的结果(特别是当HashSet包含大量元素时)?
在HashSet上,您可以同时使用这两种方法,因为HashSet在内部管理计数。
但是,如果数据位于IEnumerable<T>
或IQueryable<T>
对象中,则使用result.Any()
比使用result.Count()
(两种Linq方法)更可取。
Linq的.Count()
将遍历整个Enumerable,.Any()
将只查看Enumerable中是否存在任何对象。
更新:只是少量添加:在您使用HashSet的情况下,.Count
可能更可取,因为.Any()
需要创建并返回IEmumerator
,如果您不打算在代码中的任何位置(foreach
、Linq等)使用枚举器,这是一个很小的开销。但我认为这将被视为"微优化"。
HastSet<T>
实现了ICollection<T>
,它有一个Count
属性,所以对Count()
的调用只会调用HastSet<T>.Count
,我假设它是一个O(1)运算(这意味着它实际上不需要count,它只返回HashSet
的当前大小)。
Any
将进行迭代,直到找到符合条件的项,然后停止。
因此,在您的情况下,它只会迭代一个项目,然后停止,因此差异可能可以忽略不计。
如果您有一个想要应用的过滤器(例如x => x.IsValid
),那么Any
肯定会更快,因为Count(x => x.IsValid)
会迭代整个集合,而Any
会在找到匹配后立即停止。
出于这些原因,我通常更喜欢使用Any()
而不是Count()==0
,因为它更直接,可以避免任何潜在的性能问题。我只会切换到Count()==0
,前提是它比Any()
提供了显著的性能提升。
注意,CCD_ 27在逻辑上与调用CCD_ 28相同。这并不能改变你的问题,但没有lambda,它看起来更干净。
根据集合的类型,性能可能很重要,也可能不重要。既然hs.Any()
正是为您需要了解的内容而设计的,为什么不直接使用呢?
λ表达式x => true
在这里没有任何意义。你可以忽略这一点。