关于c#:获取IEnumerable < T >的最佳方法

关于c#:获取IEnumerable < T >的最佳方法

The best way to get a count of IEnumerable

在不枚举IEnumerable集合中所有项目的情况下,最好/最简单的方法是什么?

LINQ或Lambda可能吗?


无论如何,您都必须遍历它。 Linq提供了Count方法:

1
var result = myenum.Count();

解决方案取决于您为什么不希望对集合进行枚举。

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

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

如果是因为您希望在计数后能够枚举集合,则.Count()扩展方法可以实现此目的。您甚至可以在枚举中间的集合上调用.Count(),该集合将从计数之前的位置继续进行。例如:

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

将给出结果

0 (5)

1 (5)

2 (5)

3 (5)

4 (5)

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

1
List<int> seriesAsList = Series.Generate(5).ToList();

以上所有条件均假定您无法更改类型(即,它是从您不拥有的库中返回的)。如果可能,您可能需要考虑更改为使用具有Count属性的ICollection或IList(ICollection的作用域比IList广泛)。


您将需要枚举才能计数。其他结构(如列表)保持运行状态。


用这个。

1
2
3
IEnumerable list =..........;

list.OfType< T >().Count()

它将返回计数。


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

IEnumerable myStrings = new List(){"一个","两个","三个"};

bool hasValues = myStrings.Any();


这还取决于您希望通过计数来实现。.如果您有兴趣查找可枚举集合是否包含任何元素,则可以使用

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


如果您想使用仍然有些灵活但具有所需功能的构造,则还有IList或ICollection。它们都暗示IEnumerable。


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

  • 使用System.Linq.Dynamic;
  • myEnumerable.AsQueryable()。Count()

  • 如果您需要计数然后循环,那么最好列出一个列表。

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


    LINQ无法实现,因为调用.Count(...)会枚举集合。如果遇到无法遍历集合两次的问题,请尝试以下操作:

    1
    2
    3
    4
    5
    6
    7
    List<MyTableItem> myList = dataContext.MyTable.ToList();
    int myTableCount = myList.Count;

    foreach (MyTableItem in myList)
    {
       ...
    }


    推荐阅读