在不枚举集合中的所有项目的情况下获取 IEnumerable 集合中的项目计数的最佳/最简单方法是什么?
可以使用 LINQ 或 Lambda 吗?
在任何情况下,您都必须遍历它。Linq 提供的Count
方法:
var result = myenum.Count();
解决方案取决于您不想枚举集合的原因。
如果是因为枚举集合可能很慢,那么没有更快的解决方案。如果可能,您可能要考虑使用 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 更广泛)。
您必须枚举才能获得计数。List 等其他结构保持运行计数。
用这个。
IEnumerable list =..........;
list.OfType<T>().Count()
它将返回计数。
还有 IList 或 ICollection,如果您想使用仍然有些灵活但也具有您需要的功能的构造。它们都暗示 IEnumerable。
它还取决于您想通过计数来实现什么。如果您有兴趣查找可枚举集合是否有任何元素,您可以使用
myEnumerable.Any() over myEnumerable.Count() 前者将产生第一个元素,后者将产生所有元素。
IEnumerable 必须遍历每个项目。得到完整的计数。如果您只需要检查 IEnumerable 中是否有一个或多个项目,一种更有效的方法是检查是否有任何项目。Any() 仅检查是否有值,不会遍历所有内容。
IEnumerable myStrings = new List(){"one","two", "three"};
bool hasValues = myStrings.Any();
LINQ 不可能,因为调用 .Count(...) 确实会枚举集合。如果您遇到无法两次遍历集合的问题,请尝试以下操作:
List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;
foreach (MyTableItem in myList)
{
...
}
如果您需要计数然后循环,则最好使用列表。
如果您使用 count 来检查成员,您可以使用它Any()
来避免枚举整个集合。
最好的解决方案 - 我认为是执行以下操作:
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;