2015-05-24 2 views
0

В этом коде исходный «источник» снова загружается, прежде чем я на самом деле перечислил результирующие элементы. Я видел в основном примеры класса 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); 
    } 
+1

И, слава богу, он работает именно так. –

+0

Посмотрите на [этот ВОПРОС] (http://stackoverflow.com/questions/11565469/linq-query-reuse-and-deferred-execution) – Icemanind

+0

@HansPassant: Возможно, я неправильно понял часть отложенного выполнения. В чем разница между сценарием объектов Employee и этим? – Kodathon

ответ

1

Это определение elements захватывает вещь, на которую указывает переменная source:

var source = Enumerable.Range(1, 25); 

var elements = from num in source 
       num < 5 
       select num; 

Когда вы переназначить source, вы просто изменить то, что переменная указывает на. elements все еще ссылается на то, что source указано на момент elements.

Это не имеет никакого отношения к LINQ специально. Если были писать такой код:

var address = "123 Cherry Lane"; 
var contact = new Contact(address); 
address = "junk"; 

Контакт будет по-прежнему иметь адрес "123 Cherry Lane".

+0

Я отредактировал вопрос, чтобы включить еще один фрагмент кода, который показывает изменение в списке, я пытаюсь понять, как это отличается от оригинала? – Kodathon

+0

@ Kodathon Различие в вашем новом примере состоит в том, что переменная 'numbers' не переназначена. Изменено значение 'numbers' указывает на. –

Смежные вопросы