计数IEnumerable <T>的最佳方法

时间:2020-03-05 18:43:27  来源:igfitidea点击:

在不枚举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()