30

在不枚举集合中的所有项目的情况下获取 IEnumerable 集合中的项目计数的最佳/最简单方法是什么?

可以使用 LINQ 或 Lambda 吗?

4

11 回答 11

19

在任何情况下,您都必须遍历它。Linq 提供的Count方法:

var result = myenum.Count();
于 2008-08-26T18:12:17.420 回答
17

解决方案取决于您不想枚举集合的原因。

如果是因为枚举集合可能很慢,那么没有更快的解决方案。如果可能,您可能要考虑使用 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)

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

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

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

于 2008-08-26T19:29:11.073 回答
14

您必须枚举才能获得计数。List 等其他结构保持运行计数。

于 2008-08-26T18:12:23.893 回答
5

用这个。

IEnumerable list =..........;

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

它将返回计数。

于 2013-01-03T13:19:15.590 回答
1

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

于 2008-08-26T18:15:15.243 回答
1

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

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

于 2011-07-19T05:52:28.083 回答
1

IEnumerable 必须遍历每个项目。得到完整的计数。如果您只需要检查 IEnumerable 中是否有一个或多个项目,一种更有效的方法是检查是否有任何项目。Any() 仅检查是否有值,不会遍历所有内容。

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

bool hasValues = myStrings.Any();

于 2016-11-25T11:21:27.463 回答
0

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

List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;

foreach (MyTableItem in myList)
{
   ...
}
于 2008-08-26T18:12:21.617 回答
0

如果您需要计数然后循环,则最好使用列表。

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

于 2008-08-28T12:49:57.147 回答
0

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

  1. 使用 System.Linq.Dynamic;
  2. myEnumerable.AsQueryable().Count()
于 2010-12-20T16:42:57.537 回答
0

When I want to use the Count property, I use ILIST which implements IEnumerable and ICollection interfaces. The ILIST data structure is an Array. I stepped through using the VS Debugger and found that the .Count property below returns the Array.Length property.

IList<string> FileServerVideos = Directory.GetFiles(VIDEOSERVERPATH, "*.mp4"); 
if (FileServerVideos.Count == 0)
    return;
于 2020-12-03T20:05:31.597 回答