如何在不枚举集合中的所有项的情况下获取IEnumerable集合中项目的计数?
是否可以通过LINQ或Lambda实现?
无论如何,你都必须循环遍历它。Linq提供了Count
方法:
var result = myenum.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();
以上所有内容都假设您不能更改类型(即它是从您不拥有的库中返回的)。如果可能,您可能希望考虑更改为使用 ICollection 或 IList(ICollection 的范围比 IList 更广),它具有 Count 属性。
你需要枚举才能得到计数。像List这样的结构可以保留运行计数。
使用这个。
IEnumerable list =..........;
list.OfType<T>().Count()
它将返回计数。
IEnumerable
命名为 list
至少是令人困惑的。 - Theodor Zoulias这也取决于您通过计数想要实现什么。如果您想查找可枚举集合是否有任何元素,可以使用
myEnumerable.Any() 而不是 myEnumerable.Count(),前者将产生第一个元素,后者将产生所有元素。
如果您需要获取完整计数,则必须遍历每个项。如果您只需要检查 IEnumerable 中是否有一个或多个项,则更有效的方法是检查是否有任何项。 Any() 仅检查是否存在值,而不会遍历所有内容。
IEnumerable myStrings = new List(){"one","two", "three"};
bool hasValues = myStrings.Any();
如果你想使用一个仍然有些灵活的结构,但也具有所需功能的构造,还可以使用IList或ICollection。它们都意味着IEnumerable。
LINQ 无法实现此功能,因为调用 .Count(...) 会枚举集合。如果您遇到无法对集合进行两次迭代的问题,请尝试以下方法:
List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;
foreach (MyTableItem in myList)
{
...
}
我认为最好的解决方案是执行以下操作:
Any()
来避免枚举整个集合。