C# 获取IEnumerable计数的最佳方法<;T>;
在不枚举集合中的所有项的情况下,获取IEnumerable集合中的项计数的最佳/最简单方法是什么C# 获取IEnumerable计数的最佳方法<;T>;,c#,linq,C#,Linq,在不枚举集合中的所有项的情况下,获取IEnumerable集合中的项计数的最佳/最简单方法是什么 可能使用LINQ或Lambda?在任何情况下,都必须循环使用它。Linq提供了Count方法: var result = myenum.Count(); 对于LINQ不可能,因为调用.Count(…)会枚举集合。如果遇到无法对集合进行两次迭代的问题,请尝试以下方法: List<MyTableItem> myList = dataContext.MyTable.ToList(); int
可能使用LINQ或Lambda?在任何情况下,都必须循环使用它。Linq提供了
Count
方法:
var result = myenum.Count();
对于LINQ不可能,因为调用.Count(…)会枚举集合。如果遇到无法对集合进行两次迭代的问题,请尝试以下方法:
List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;
foreach (MyTableItem in myList)
{
...
}
List myList=dataContext.MyTable.ToList();
int myTableCount=myList.Count;
foreach(myList中的MyTableItem)
{
...
}
您必须枚举才能获得计数。其他构造(如列表)保持运行计数。如果您想使用一个仍然具有一定灵活性但又具有所需功能的构造,还可以使用IList或ICollection。它们都意味着IEnumerable。解决方案取决于您不希望枚举整个集合的原因
如果是因为枚举集合可能比较慢,那么没有更快的解决方案。如果可能的话,您可能需要考虑使用ICLICONTION。除非枚举速度非常慢(例如,它从磁盘读取项目),否则速度应该不会有问题
如果是因为枚举集合需要更多的代码,那么它已经以.Count()扩展方法的形式为您编写了。只需使用MyEnumerable.Count()
如果是因为您希望能够在计数后枚举集合,那么.Count()扩展方法允许这样做。你甚至可以在一个你正在枚举的集合中调用.CONTHER(),它将从计数之前的位置继续进行。例如:
foreach (int item in Series.Generate(5))
{
Console.WriteLine(item + "(" + myEnumerable.Count() + ")");
}
List<int> seriesAsList = Series.Generate(5).ToList();
将给出结果
0(5)
1(5)
2(5)
3(5)
4(5)
如果是因为枚举有副作用(例如写入磁盘/控制台)或依赖于可能在计数和枚举之间变化的变量(例如从磁盘读取)[N.B.如果可能,我建议重新考虑体系结构,因为这可能会导致很多问题]然后考虑的一个可能性是读取枚举到一个间歇存储。例如:
foreach (int item in Series.Generate(5))
{
Console.WriteLine(item + "(" + myEnumerable.Count() + ")");
}
List<int> seriesAsList = Series.Generate(5).ToList();
List seriesalist=Series.Generate(5.ToList();
以上所有假设您不能更改类型(即,它是从您不拥有的库返回的)。如果可能的话,您可能需要考虑使用IcLIST或ILIST(ICLIST比ILIST更广泛的范围)来改变它。
如果使用count检查成员,可以使用
Any()
避免枚举整个集合。最佳解决方案-我认为是执行以下操作:
这还取决于你想通过计数实现什么。。如果您有兴趣查找可枚举集合是否有任何元素,可以使用 myEnumerable.Count()上的myEnumerable.Any(),其中前者将生成第一个元素,后者将生成所有元素 用这个
IEnumerable list =..........;
list.OfType<T>().Count()
IEnumerable列表=。。。。。。。。。。;
list.OfType().Count()
它将返回计数。IEnumerable必须遍历每个项目。要得到完整的计数。 如果只需要检查IEnumerable中是否有一个或多个项,则更有效的方法是检查是否有。Any()只检查是否存在值,而不循环遍历所有内容 IEnumerable myStrings=新列表(){“一”、“二”、“三”}
bool hasValues=myStrings.Any() 当我想使用Count属性时,我使用实现IEnumerable和ICollection接口的ILIST。ILIST数据结构是一个数组。我逐步使用VS调试器,发现下面的.Count属性返回Array.Length属性
IList<string> FileServerVideos = Directory.GetFiles(VIDEOSERVERPATH, "*.mp4");
if (FileServerVideos.Count == 0)
return;
IList FileServerVideos=Directory.GetFiles(VIDEOSERVERPATH,*.mp4”);
if(FileServerVideos.Count==0)
返回;
错误。这并不比其他任何事情都好,而且可能更糟。还是一样。。如果我们只需要计数,并且因为我们不想迭代每个记录,该怎么办。。为什么?因为我们需要快速..可能重复的Yep,只要您在文件开头有“using System.Linq;”,这就行了。如果没有Linq,这就不起作用。如果IEnumerable变量被传递到方法中,那么variable.Count()对我起作用。@Vikram据我所知,这不可能是真的。你确定你没有在某处强制转换吗?对于IEnumerable变量,它必须是variable.Count(),或者如果你只是检查是否有任何元素变量。任何()给一个IEnumerable
命名都至少会让人困惑。