计数IEnumerable <T>的最佳方法
在不枚举IEnumerable集合中的项目总数的情况下,什么是最好/最简单的方法?
LINQ或者Lambda可能吗?
解决方案
回答
无论如何,我们都必须遍历它。 Linq提供了Count
方法:
var result = myenum.Count();
回答
LINQ无法实现,因为调用.Count(...)会枚举集合。如果遇到无法遍历集合两次的问题,请尝试以下操作:
List<MyTableItem> myList = dataContext.MyTable.ToList(); int myTableCount = myList.Count; foreach (MyTableItem in myList) { ... }
回答
我们将必须枚举才能计数。其他构造(例如List)仍在运行。
回答
如果我们想使用仍然有些灵活但具有所需功能的构造,则还有IList或者ICollection。它们都暗示IEnumerable。
回答
解决方案取决于我们为什么不希望对集合进行枚举。
如果是因为枚举集合可能很慢,那么没有解决方案会更快。如果可能,我们可能要考虑使用ICollection。除非枚举非常慢(例如,它从磁盘读取项目),否则速度应该不是问题。
如果是因为枚举集合将需要更多代码,则已经以.Count()扩展方法的形式为我们编写了该集合。只需使用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)
如果是因为枚举有副作用(例如,写入磁盘/控制台)或者取决于在计数和枚举之间可能发生变化的变量(例如,从磁盘读取)[N.B。如果可能的话,我建议重新考虑体系结构,因为这可能会引起很多问题。]然后考虑的一种可能性是将枚举读取到间歇存储中。例如:
List<int> seriesAsList = Series.Generate(5).ToList();
以上所有条件均假定我们无法更改类型(即,它是从我们不拥有的库中返回的)。如果可能,我们可能要考虑更改为使用上面带有Count属性的ICollection或者IList(ICollection的作用域比IList广泛)。
回答
如果我们需要计数然后循环,则最好使用列表。
如果我们使用count来检查成员,则可以使用Any()
来避免枚举整个集合。
回答
我认为最好的解决方案是执行以下操作:
- 使用System.Linq.Dynamic;
- myEnumerable.AsQueryable()。Count()