views:

835

answers:

2

Hi folks,

in the System.Linq namespace, we can now extend our IEnumerable's to have theAny() and Count() extension methods.

I was told recently that if i want to check that a collection contains 1 or more items inside it, I should use the .Any() extension method instead of the .Count() > 0 extension method because the .Count() extension method has to iterate through all the items.

Secondly, some collections have a property (not an extension method) that is Count or Length. Would it be better to use those, instead of .Any() or .Count() ?

yea / nae ?

+1  A: 

Well, the .Count() extension method won't use the .Count property, but I would assume you wouldn't use the .Count() method for a simple collection, but rather at the end of a LINQ statement with filtering criteria, etc.

In that context, .Any() will be faster than .Count() > 0.

Lasse V. Karlsen
Actually, for an ICollection<T>, it will. But as you say - this doesn't help once you have filtered etc
Marc Gravell
+16  A: 

If you are starting with something that has a .Length or .Count (such as ICollection<T>, IList<T>, List<T>, etc) - then this will be the fastest option, since it doesn't need to go through the GetEnumerator()/MoveNext()/Dispose() sequence required by Any() to check for a non-empty IEnumerable<T> sequence.

For just IEnumerable<T>, then Any() will generally be quicker, as it only has to look at one iteration. However, note that the LINQ-to-Objects implementation of Count() does check for ICollection<T> (using .Count as an optimisation) - so if your underlying data-source is directly a list/collection, there won't be a huge difference. Don't ask me why it doesn't use the non-generic ICollection...

Of course, if you have used LINQ to filter it etc (Where etc), you will have an iterator-block based sequence, and so this ICollection<T> optimisation is useless.

In general with IEnumerable<T> : stick with Any() ;-p

Marc Gravell
Awesome awesome awesome! cheers mate!
Pure.Krome
Marc: ICollection<T> does not actually derive from ICollection. I was surprised too, but Reflector doesn't lie.
Bryan Watts
Doesn't Any() implementation check for ICollection interface and check after for Count property?
derigel
No, it doesn't (having checked reflector)
Marc Gravell