В этом коде исходный «источник» снова загружается, прежде чем я на самом деле перечислил результирующие элементы. Я видел в основном примеры класса Employee - у нас есть объекты List of Employee и перед перечислением результата какого-то запроса добавляется дополнительный объект, который появляется в нумерации вывода.LINQ отложенное исполнение - почему он не рассматривает изменение из результата Enumerable.Range?
var source = Enumerable.Range(1, 25);
var elements = from num in source
num < 5
select num;
source = Enumerable.Range(0, 25);
foreach (int num in elements)
{
Console.WriteLine(num);
}
Это не включает 0 на выходе. Поскольку запрос выполняется только после запуска перечисления, не следует печатать 0? Есть что-то, что я испортил?
EDIT: Прошу прощения, но мне нужно еще одно разъяснение. В приведенном ниже фрагменте кода печатаются 10 и 20 - как он отличается от описанного выше сценария?
var numbers = new List<int>();
numbers.Add(1);
IEnumerable<int> query = numbers.Select(n => n * 10);
numbers.Add(2);
foreach (int num in query)
{
Console.WriteLine(num);
}
И, слава богу, он работает именно так. –
Посмотрите на [этот ВОПРОС] (http://stackoverflow.com/questions/11565469/linq-query-reuse-and-deferred-execution) – Icemanind
@HansPassant: Возможно, я неправильно понял часть отложенного выполнения. В чем разница между сценарием объектов Employee и этим? – Kodathon