计算IEnumerable 的最佳方法

什么是最好/最简单的方法来获取IEnumerable集合中的项目数而不枚举集合中的所有项目?

可以使用LINQ或Lambda吗?

您必须枚举以获得计数。 像List这样的其他构造保持运行计数。

解决方案取决于您不希望通过集合枚举的原因。

如果是因为枚举集合可能很慢,那么没有更快的解决方案。 如果可能,您可能需要考虑使用ICollection。 除非枚举非常慢(例如,它从磁盘读取项目),否则速度应该不是问题。

如果是因为枚举集合将需要更多代码,那么它已经以.Count()扩展方法的forms为您编写。 只需使用MyEnumerable.Count()。

如果是因为您希望能够在计数后枚举该集合,那么.Count()扩展方法允许这样做。 你甚至可以在你正在枚举的集合上调用.Count(),它将继续从计数之前的位置开始。 例如:

foreach (int item in Series.Generate(5)) { Console.WriteLine(item + "(" + myEnumerable.Count() + ")"); } 

会给出结果

0(5)

1(5)

2(5)

3(5)

4(5)

如果这是因为枚举有副作用(例如写入磁盘/控制台)或依赖于可能在计数和枚举之间变化的变量(例如从磁盘读取)[NB如果可能,我建议重新考虑体系结构,因为这会导致很多问题]然后考虑一种可能性是将枚举读入间歇存储。 例如:

 List seriesAsList = Series.Generate(5).ToList(); 

以上所有假设您无法更改类型(即,它是从您不拥有的库中返回的)。 如果可能,您可能需要考虑更改为使用ICollection或IList(ICollection的范围比IList更广泛),其上包含Count属性。

无论如何,你必须循环它。 Linq提供Count方法:

 var result = myenum.Count(); 

用这个。

 IEnumerable list =..........; list.OfType().Count() 

它将返回计数。

还有IList或ICollection,如果你想使用一个仍然有些灵活的结构,但也有你需要的function。 他们都暗示IEnumerable。

它还取决于你想要通过计数实现什么..如果你有兴趣找到可枚举集合是否有任何元素,你可以使用

myEnumerable.Any()over myEnumerable.Count(),其中前者将产生第一个元素,后者将产生所有元素。

IEnumerable将不得不遍历每个项目。 得到全部数。 如果您只需要检查IEnumerable中是否有一个或多个项目,则更有效的方法是检查是否有任何项目。 Any()只检查是否存在值并且不会遍历所有内容。

IEnumerable myStrings = new List(){“one”,“two”,“three”};

bool hasValues = myStrings.Any();

LINQ不可能,因为调用.Count(…)枚举集合。 如果您遇到无法迭代两次集合的问题,请尝试以下方法:

 List myList = dataContext.MyTable.ToList(); int myTableCount = myList.Count; foreach (MyTableItem in myList) { ... } 

如果您需要计算然后循环,您可能会更好地使用列表。

如果您使用count来检查成员,则可以使用Any()来避免枚举整个集合。

我认为最好的解决方案是执行以下操作:

  1. 使用System.Linq.Dynamic;
  2. myEnumerable.AsQueryable()。COUNT()