Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The best way to get a count of IEnumerable<T>

Tags:

c#

linq

Whats the best/easiest way to obtain a count of items within an IEnumerable collection without enumerating over all of the items in the collection?

Possible with LINQ or Lambda?

like image 494
Sean Chambers Avatar asked Aug 26 '08 18:08

Sean Chambers


People also ask

How do you get the count of IEnumerable?

IEnumerable has not Count function or property. To get this, you can store count variable (with foreach, for example) or solve using Linq to get count.

Does IEnumerable have count?

IEnumerable doesn't have a Count method.

How do you measure length of IEnumerable?

If you need to read the number of items in an IEnumerable<T> you have to call the extension method Count , which in general (look at Matthew comment) would internally iterate through the elements of the sequence and it will return you the number of items in the sequence. There isn't any other more immediate way.

What does count () do in C#?

To count the number of elements in the C# array, we can use the count() method from the IEnumerable. It is included in the System.


2 Answers

In any case, you have to loop through it. Linq offers the Count method:

var result = myenum.Count(); 
like image 110
Konrad Rudolph Avatar answered Oct 05 '22 06:10

Konrad Rudolph


The solution depends on why you don't want to enumerate through the collection.

If it's because enumerating the collection might be slow, then there is no solution that will be faster. You might want to consider using an ICollection instead if possible. Unless the enumeration is remarkably slow (e.g. it reads items from disk) speed shouldn't be a problem though.

If it's because enumerating the collection will require more code then it's already been written for you in the form of the .Count() extension method. Just use MyEnumerable.Count().

If it's because you want to be able to enumerate the collection after you've counted then the .Count() extension method allows for this. You can even call .Count() on a collection you're in the middle of enumerating and it will carry on from where it was before the count. For example:

foreach (int item in Series.Generate(5)) {     Console.WriteLine(item + "(" + myEnumerable.Count() + ")"); } 

will give the results

0 (5)

1 (5)

2 (5)

3 (5)

4 (5)

If it's because the enumeration has side effects (e.g. writes to disk/console) or is dependant on variables that may change between counting and enumerating (e.g. reads from disk) [N.B. If possible, I would suggest rethinking the architecture as this can cause a lot of problems] then one possibility to consider is reading the enumeration into an intermittent storage. For example:

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

All of the above assume you can't change the type (i.e. it is returned from a library that you do not own). If possible you might want to consider changing to use an ICollection or IList (ICollection being more widely scoped than IList) which has a Count property on it.

like image 23
ICR Avatar answered Oct 05 '22 06:10

ICR