Kon*_*lph 17
无论如何,你必须循环它.Linq提供的Count方法:
var result = myenum.Count();
Run Code Online (Sandbox Code Playgroud)
ICR*_*ICR 16
解决方案取决于您不希望通过集合枚举的原因.
如果是因为枚举集合可能很慢,那么没有更快的解决方案.如果可能,您可能需要考虑使用ICollection.除非枚举非常慢(例如,它从磁盘读取项目),速度不应该是一个问题.
如果是因为枚举集合将需要更多代码,那么它已经以.Count()扩展方法的形式为您编写.只需使用MyEnumerable.Count().
如果是因为您希望能够在计数后枚举该集合,那么.Count()扩展方法允许这样做.你甚至可以在你正在枚举的集合上调用.Count(),它将继续从计数之前的位置开始.例如:
foreach (int item in Series.Generate(5))
{
Console.WriteLine(item + "(" + myEnumerable.Count() + ")");
}
Run Code Online (Sandbox Code Playgroud)
会给出结果
0(5)
1(5)
2(5)
3(5)
4(5)
如果这是因为枚举有副作用(例如写入磁盘/控制台)或依赖于可能在计数和枚举之间改变的变量(例如从磁盘读取)[NB如果可能,我建议重新考虑体系结构,因为这可能导致很多问题]然后考虑的一个可能性是将枚举读入间歇存储.例如:
List<int> seriesAsList = Series.Generate(5).ToList();
Run Code Online (Sandbox Code Playgroud)
以上所有假设您无法更改类型(即,它是从您不拥有的库中返回的).如果可能,您可能需要考虑更改为使用ICollection或IList(ICollection的范围比IList更广泛),其上有一个Count属性.
用这个.
IEnumerable list =..........;
list.OfType<T>().Count()
Run Code Online (Sandbox Code Playgroud)
它将返回计数.