С http://msdn.microsoft.com/en-us/library/ms132433.aspx:
Получение значения этого свойства является операцией O (1).
Это гарантирует, что доступ к Count
не будет повторяться по всей коллекции.
Редактировать: как и предполагалось многими другими авторами, IEnumerable<...>.Count()
, тем не менее, не гарантированно будет O (1). Используйте с осторожностью!
IEnumerable<...>.Count()
- это метод расширения, определенный в System.Linq.Enumerable
. Текущая реализация делает явный тест, если подсчитанный IEnumerable<T>
действительно является экземпляром ICollection<T>
, и использует ICollection<T>.Count
, если это возможно. В противном случае он пересекает IEnumerable<T>
(возможно, расширение ленивых вычислений расширяется) и считает элементы один за другим.
Однако я не нашел в документации, гарантируется ли, что IEnumerable<...>.Count()
использует O (1), если это возможно, я только проверял реализацию в .NET 3.5 с Reflector.
Необходимое позднее добавление: многие популярные контейнеры не являются производными от Collection<T>
, но, тем не менее, их свойство Count
имеет значение O (1) (то есть не будет перебирать всю коллекцию). Примеры: HashSet<T>.Count
(наиболее вероятно, о чем хотел спросить ОП), Dictionary<K, V>.Count
, LinkedList<T>.Count
, List<T>.Count
, Queue<T>.Count
, Stack<T>.Count
и т. Д.
Все эти коллекции реализуют ICollection<T>
или просто ICollection
, поэтому их Count
является реализацией ICollection<T>.Count
(или ICollection.Count
). Необязательно, чтобы реализация ICollection<T>.Count
была операцией O (1), но упомянутые выше делают именно так, согласно документации.
(Обратите внимание: некоторые контейнеры, например Queue<T>
, реализуют неуниверсальный ICollection
, но не ICollection<T>
, поэтому они "наследуют" свойство Count
только от from ICollection
.)