Использование reflector Я заметил, что System.Linq.Enumerable.Count
имеет в нем условие, чтобы оптимизировать его для случая, когда переданный IEnumerable<T>
фактически является ICollection<T>
. Если листинг преуспевает, метод Count не требует итерации по каждому элементу, но может вызвать метод Count ICollection.
Исходя из этого, я начал думать, что IEnumerable<T>
можно использовать как просмотр в режиме просмотра только для чтения, без потери производительности, которую я изначально ожидал, на основе API IEnumerable<T>
Мне было интересно, сохраняется ли оптимизация Count
, когда IEnumerable<T>
является результатом оператора Select
над ICollection
, но на основе отраженного кода этот случай не оптимизирован и требует итерация по всем элементам.
Вы делаете те же выводы из рефлектора? Что может быть причиной отсутствия этой оптимизации? Мне кажется, что в этой общей операции много времени потрачено впустую. Требует ли спецификация, чтобы каждый элемент оценивался, даже если граф можно определить без этого?