Длина является фиксированным свойством, например, одномерного массива или строки. Таким образом, никогда не требуется операция подсчета (многомерные массивы имеют размер всех умноженных размеров). Операция O (1) здесь означает, что время поиска всегда одинаково, независимо от количества элементов. Линейный поиск (в противоположность этому) будет O (n).
Свойство Count в ICollections (например, List и List ) может измениться, поэтому его необходимо обновить при операциях добавления / удаления или при запросе Count после изменения коллекции. Зависит от реализации объекта.
Метод LINQ Count () в основном выполняет итерацию КАЖДЫЙ раз, когда он вызывается (кроме случаев, когда объект имеет тип ICollection, тогда запрашивается свойство ICollection.Count).
Обратите внимание, что IEnumerables часто не являются уже определенными коллекциями объектов (такими как списки, массивы, хеш-таблицы и т. Д.), Но связаны с фоновыми операциями, которые генерируют результаты всякий раз, когда они запрашиваются (это называется отложенным выполнением).
Как правило, у вас есть SQL-подобный оператор LINQ, подобный этому (типичное применение отложенного выполнения):
IEnumerable<Person> deptLeaders =
from p in persons
join d in departments
on p.ID equals d.LeaderID
orderby p.LastName, p.FirstName
select p;
Тогда есть код, подобный этому:
if (deptLeaders.Count() > 0)
{
ReportNumberOfDeptLeaders(deptLeaders.Count());
if (deptLeaders.Count() > 20)
WarnTooManyDepartmentLeaders(deptLeaders.Count());
}
Таким образом, когда выдается предупреждение для слишком большого числа руководителей департаментов, .NET проходит ЧЕТЫРЕ РАЗА по лицам, проверяет их по лидерам департаментов, сортирует их по имени и затем подсчитывает объекты результатов.
И это только в том случае, если сотрудники и отделы представляют собой наборы заданных значений, а не сами запросы.