Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取IEnumerable计数的最佳方法<;T>;_C#_Linq - Fatal编程技术网

C# 获取IEnumerable计数的最佳方法<;T>;

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

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


可能使用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()
避免枚举整个集合。

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

  • 使用System.Linq.Dynamic
  • myEnumerable.AsQueryable().Count()

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

    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
    命名都至少会让人困惑。