Классы, реализующие System.Collection.ICollection, знают, сколько элементов в их последовательности. У них есть свойство Count, которое возвращает номер последовательности. Примерами являются Список, Словарь и Очередь.
Другие классы, реализующие IEnumerable, могут не реализовывать ICollection. У тебя нет счета собственности. Однако вы все равно можете узнать количество элементов в последовательности, перечислив все элементы и подсчитав их.
Мне последний способ кажется намного медленнее.
Единственное, что метод Enumerable.Count(this IEnumerable) знает о последовательности, это то, что он реализует IEnumerable. Он не знает, что у последовательности есть свойство, которое дает вам количество элементов.
Обычно это означает, что если вы используете Count() для списка, функция должна выполнять итерацию по всем элементам.
Однако реализация Enumerable.Count(IEnumerable) может проверять, реализует ли последовательность интерфейс ICollection, и если да, то может возвращать Count вместо его перечисления.
Вопрос: достаточно ли умен Enumerable.Count(этот IEnumerable), чтобы проверить, реализует ли последовательность ICollection, или он всегда выполняет итерацию по всем элементам?
В последнем случае было бы разумно расширить Enumerable функцией Count, которая проверяет, реализует ли объект ICollection, и если да, возвращает ICollection.Count()?