IEnumerable<T>
- это, как правило, лучший выбор по причинам, перечисленным в другом месте. Тем не менее, я хочу поднять один пункт о Count()
. Квинтин неверен, когда говорит, что сам тип реализует Count()
. На самом деле он реализован в Enumerable.Count()
как метод расширения, что означает, что другие типы не могут переопределить его для обеспечения более эффективных реализаций.
По умолчанию Count()
должен выполнять итерацию по всей последовательности для подсчета элементов. Однако он знает о ICollection<T>
и ICollection
и оптимизирован для этих случаев. (В .NET 3.5 IIRC он оптимизирован только для ICollection<T>
.) Теперь массив реализует это , поэтому Enumerable.Count()
откладывается до ICollection<T>.Count
и избегает повторения по всей последовательности. Это все еще будет немного медленнее, чем прямой вызов Length
, потому что Count()
должен обнаружить, что для начала он реализует ICollection<T>
, но по крайней мере это все еще O (1).
То же самое относится и к производительности в целом: код JITted вполне может быть несколько сложнее при итерации по массиву, а не по общей последовательности. В основном вы дадите JIT больше информации для игры, и даже сам компилятор C # по-разному обрабатывает массивы для итерации (используя индексатор напрямую).
Однако эти различия в производительности будут несущественными для большинства приложений - я бы определенно использовал более общий интерфейс, пока у меня не будет веской причины не делать этого.