代码之家  ›  专栏  ›  技术社区  ›  Sean Chambers

获取IEnumerable计数的最佳方法

  •  27
  • Sean Chambers  · 技术社区  · 16 年前

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

    是否可以使用Linq或lambda?

    10 回复  |  直到 7 年前
        1
  •  12
  •   kame Christian C. Salvadó    7 年前

    你得枚举才能得到一个计数。其他构造(如列表)保持运行计数。

        2
  •  16
  •   ICR    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.如果可能,我建议重新考虑体系结构,因为这会导致很多问题],那么考虑的一种可能性是将枚举读取到I中。内部存储器。例如:

    List<int> seriesAsList = Series.Generate(5).ToList();
    

    以上所有假设都假定您不能更改类型(即,它是从您不拥有的库中返回的)。如果可能,您可能会考虑将其更改为使用ICollection或IList(ICollection的作用域比IList更广),后者具有Count属性。

        3
  •  14
  •   Konrad Rudolph    16 年前

    在任何情况下,都必须循环通过它。LINQ提供 Count 方法:

    var result = myenum.Count();
    
        4
  •  6
  •   C. A. McCann Ravikant Cherukuri    11 年前

    用这个。

    IEnumerable list =..........;
    
    list.OfType<T>().Count()
    

    它将返回计数。

        5
  •  1
  •   Joel Coehoorn    16 年前

    还有ilist或icolection,如果您想使用一个仍然有些灵活的结构,但也有您需要的特性。它们都意味着不可数。

        6
  •  1
  •   Soundararajan    13 年前

    它还取决于你想通过计算得到什么。如果您有兴趣查找可枚举集合是否包含任何元素,可以使用

    myEnumerable.any()覆盖myEnumerable.count(),前者将生成第一个元素,后者将生成所有元素。

        7
  •  1
  •   Timmy Fuller    7 年前

    IEnumerable必须遍历每个项。以获得完整的计数。 如果您只需要检查IEnumerable中是否存在一个或多个项,则更有效的方法是检查是否存在任何项。any()只检查是否有一个值,并且不会循环遍历所有内容。

    IEnumerable myStrings=new list()“one”、“two”、“three”

    bool hasValues=myStrings.any();

        8
  •  0
  •   Greg Hurlman    16 年前

    不能与Linq一起使用,因为调用.Count(…)会枚举集合。如果遇到无法两次迭代集合的问题,请尝试以下操作:

    List<MyTableItem> myList = dataContext.MyTable.ToList();
    int myTableCount = myList.Count;
    
    foreach (MyTableItem in myList)
    {
       ...
    }
    
        9
  •  0
  •   Keith    16 年前

    如果你需要计数然后循环,你最好有一个列表。

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

        10
  •  0
  •   Moustafa Deif    13 年前

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

    1. 使用system.linq.dynamic;
    2. myEnumerable.asQueryable().Count())