空哈希集-计数与任意

本文关键字:任意 哈希集 | 更新日期: 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在这里没有任何意义。你可以忽略这一点。