【问题标题】:Should Count() of an IEnumerable be avoided?应该避免 IEnumerable 的 Count() 吗?
【发布时间】:2015-08-04 17:41:42
【问题描述】:

一般来说,我使用List,然后当我不再需要更新它们时将它们返回为IEnumerable

但是,我遇到了一个问题,我实际上需要枚举它们,但首先需要知道计数。

IEnumerable 会枚举每个项目并找到计数 (O(N)),还是会依赖 List 的 Count 属性 (O(1))?

另外,如果IEnumerable 是 LINQ 查询的结果怎么办?

【问题讨论】:

  • 您可以将List 转换为IReadOnlyCollection。它更好地说明了您的意图,并且还具有 Count 属性。
  • 我完全同意@AndreySarafanov。而且您仍然可以享受协方差的好处 (IReadOnlyCollection<out T>)。当然还有IReadOnlyList<out T>,如果您可能需要(或想要公开)索引器访问权限。

标签: c# linq ienumerable


【解决方案1】:

IEnumerable 会枚举每个项目并找到计数 (O(N)),还是会依赖 List 的 Count 属性 (O(1))?

它将使用Count 属性。基本上,实现检查对象是否实现ICollection<T>ICollection,如果是则调用相关的Count 属性。 (非泛型 ICollection 的使用仅在 .NET 4 中引入;在 .NET 3.5 中仅注意到 ICollection<T>。)

ICollection<T> 只是 documented,但是:

如果源的类型实现ICollection<T>,则该实现用于获取元素的计数。否则,此方法确定计数。

【讨论】:

猜你喜欢
  • 2011-03-20
  • 2014-10-24
  • 2012-10-14
  • 2022-12-16
  • 2012-02-25
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多