我应该如何获得 IEnumerable 的长度?

Evo*_*lor 7 c# linq performance ienumerable count

我正在编写一些代码,然后去获取 IEnumerable 的长度。当我写的时候myEnumerable.Count(),令我惊讶的是,它没有编译。在阅读了 IEnumerable Count() 和 Length 之间的差异后,我意识到实际上是 Linq 为我提供了扩展方法。

使用 .Length 也不适合我。我使用的是旧版本的 C#,所以也许这就是原因。

获取 IEnumerable 长度的最佳实践是什么?我应该使用 Linq 的 Count() 方法吗?或者有更好的方法。.Length 在更高版本的 C# 中可用吗?

或者,如果我需要计数,IEnumerable 是否是该工作的错误工具?我应该改用 ICollection 吗? 在不迭代的情况下计算 IEnumerable<T> 中的项目?说 ICollection 是一个解决方案,但是如果您想要一个带有计数的 IEnumerable,它是否是正确的解决方案?

强制性代码片段:

var myEnumerable = IEnumerable<Foo>();

int count1 = myEnumerable.Length; //Does not compile

int count2 = myEnumerable.Count(); //Requires Linq namespace

int count3 = 0; //I hope not
for(var enumeration in myEnumerable)
{
    count3++;
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*tos 7

如果您需要读取一个中的项目数,IEnumerable<T>您必须调用扩展方法Count通常(查看马修评论)将在内部迭代序列的元素,它将返回序列中的项目数。没有其他更直接的方法了。

如果您知道您的序列是一个数组,则可以使用 thLength属性对其进行转换并读取它们的项目数。

不,在以后的版本中没有任何这样的方法。

关于Count方法的实现细节,请看这里

  • 请注意,`Linq.Count()` 足够聪明,可以识别实现 `ICollection&lt;T&gt;` 的数组和列表以避免迭代,并且只是强制转换并返回 `Count`,这是一个 O(1) 而不是 O(N) 操作. [查看源代码。](https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,41ef9e39e54d0d0b) (2认同)
  • 这一切都很好,但它造成了太多混乱,因为[可能的重复](/sf/answers/59743491/)同样有涵盖这些选项和实现细节的答案。 (2认同)