Операторы запросов, как правило, продвигают только столько шагов вперед в исходной коллекции, сколько им нужно для получения необходимого количества выходных результатов.
В вашем примере Take()
потребуется только 2 элемента из Select()
, поэтомуэто все, что будет произведено Select()
.Select()
, вероятно, реализовано примерно так (взято из блога Джона Скита :
private static IEnumerable<TResult> Select<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, TResult> selector)
{
foreach (TSource item in source)
{
yield return selector(item);
}
}
Операторам сортировки и группировки потребуется создать полный набор результатов, прежде чем можно будет что-либо вернуть (например, OrderBy()
).
Пока вы не используете упорядочение, группировку, фильтрацию (например, с помощью Where()
или Skip()
) или любой другой оператор, изменяющий количество элементов в последовательностине должно иметь значения, куда в цепи вы положили Take()
.