计算IEnumerable <t> </t>的最佳方法

时间:2008-08-26 18:09:31

标签: c# linq

最好/最简单的方法是获取IEnumerable集合中的项目数而不枚举集合中的所有项目?

LINQ或Lambda可能吗?

11 个答案:

答案 0 :(得分:16)

解决方案取决于您不希望通过集合进行枚举的原因。

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

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

答案 1 :(得分:14)

无论如何,你必须循环它。 Linq提供Count方法:

var result = myenum.Count();

答案 2 :(得分:12)

您必须枚举以获得计数。像List这样的其他结构会保持运行计数。

答案 3 :(得分:6)

使用此功能。

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

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

它将返回计数。

答案 4 :(得分:1)

还有IList或ICollection,如果你想使用一个仍然有些灵活的结构,但也有你需要的功能。它们都意味着IEnumerable。

答案 5 :(得分:1)

它还取决于你想通过计算实现什么..如果你有兴趣发现可枚举集合是否有任何元素,你可以使用

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

答案 6 :(得分:1)

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

IEnumerable myStrings = new List(){&#34; one&#34;,&#34; two&#34;,&#34; three&#34;};

bool hasValues = myStrings.Any();

答案 7 :(得分:0)

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

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

foreach (MyTableItem in myList)
{
   ...
}

答案 8 :(得分:0)

如果你需要计算然后循环,你可能会更好地使用列表。

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

答案 9 :(得分:0)

最好的解决方案 - 我认为是要做到以下几点:

  1. 使用System.Linq.Dynamic;
  2. myEnumerable.AsQueryable()。COUNT()

答案 10 :(得分:0)

当我想使用Count属性时,我使用实现IEnumerable和ICollection接口的ILIST。 ILIST数据结构是一个数组。我逐步使用VS调试器,发现下面的.Count属性返回Array.Length属性。

IList<string> FileServerVideos = Directory.GetFiles(VIDEOSERVERPATH, "*.mp4"); 
if (FileServerVideos.Count == 0)
    return;