The best way to get a count of IEnumerable
在不枚举IEnumerable集合中所有项目的情况下,最好/最简单的方法是什么? LINQ或Lambda可能吗?
无论如何,您都必须遍历它。 Linq提供了
解决方案取决于您为什么不希望对集合进行枚举。 如果是因为枚举集合可能很慢,那么没有解决方案会更快。如果可能,您可能要考虑使用ICollection。除非枚举非常慢(例如,它从磁盘读取项目),否则速度应该不是问题。 如果是因为枚举集合将需要更多代码,则已经以.Count()扩展方法的形式为您编写了该集合。只需使用MyEnumerable.Count()。 如果是因为您希望在计数后能够枚举集合,则.Count()扩展方法可以实现此目的。您甚至可以在枚举中间的集合上调用.Count(),该集合将从计数之前的位置继续进行。例如:
将给出结果
如果是因为枚举有副作用(例如,写入磁盘/控制台)或取决于在计数和枚举之间可能发生变化的变量(例如,从磁盘读取)[N.B。如果可能的话,我建议重新考虑体系结构,因为这可能会引起很多问题。]然后要考虑的一种可能性是将枚举读取到间歇存储中。例如:
以上所有条件均假定您无法更改类型(即,它是从您不拥有的库中返回的)。如果可能,您可能需要考虑更改为使用具有Count属性的ICollection或IList(ICollection的作用域比IList广泛)。 您将需要枚举才能计数。其他结构(如列表)保持运行状态。 用这个。
它将返回计数。
IEnumerable将必须遍历每个项目。获得全部计数。 IEnumerable myStrings = new List(){"一个","两个","三个"}; bool hasValues = myStrings.Any(); 这还取决于您希望通过计数来实现。.如果您有兴趣查找可枚举集合是否包含任何元素,则可以使用 myEnumerable.Count()之上的myEnumerable.Any(),其中前者将产生第一个元素,而后者将产生所有元素。 如果您想使用仍然有些灵活但具有所需功能的构造,则还有IList或ICollection。它们都暗示IEnumerable。 我认为最好的解决方案是执行以下操作: 如果您需要计数然后循环,那么最好列出一个列表。
如果您使用count检查成员,则可以使用 LINQ无法实现,因为调用.Count(...)会枚举集合。如果遇到无法遍历集合两次的问题,请尝试以下操作:
|