IEnumerable<T>
is generally a better choice here, for the reasons listed elsewhere. However, I want to bring up one point about Count()
. Quintin is incorrect when he says that the type itself implements Count()
. It's actually implemented in Enumerable.Count()
as an extension method, which means other types don't get to override it to provide more efficient implementations.
By default, Count()
has to iterate over the whole sequence to count the items. However, it does know about ICollection<T>
and ICollection
, and is optimised for those cases. (In .NET 3.5 IIRC it's only optimised for ICollection<T>
.) Now the array does implement that, so Enumerable.Count()
defers to ICollection<T>.Count
and avoids iterating over the whole sequence. It's still going to be slightly slower than calling Length
directly, because Count()
has to discover that it implements ICollection<T>
to start with - but at least it's still O(1).
The same kind of thing is true for performance in general: the JITted code may well be somewhat tighter when iterating over an array rather than a general sequence. You'd basically be giving the JIT more information to play with, and even the C# compiler itself treats arrays differently for iteration (using the indexer directly).
However, these performance differences are going to be inconsequential for most applications - I'd definitely go with the more general interface until I had good reason not to.