Предоставлено items
- результат выражения q LINQ:
var items = from item in ItemsSource.RetrieveItems()
where ...
Предположим, что для генерации каждого элемента требуется некоторое время, отличное от negligeble.
Возможны два режима работы:
-
Использование
foreach
позволит начать работу с элементами в начале коллекции намного раньше, чем в конце концов станет доступным. Однако, если мы захотим позже обработать одну и ту же коллекцию, нам придется скопировать ее сохранение:var storedItems = new List<Item>(); foreach(var item in items){ Process(item); storedItems .Add(item); } // Later foreach(var item in storedItems){ ProcessMore(item); }
Потому что, если бы мы только что сделали
foreach(... in items)
, тогдаtemsSource.RetrieveItems()
снова будет вызван. -
Мы могли бы использовать
.ToList()
right upfront, но это заставило бы нас ждать, пока последний элемент будет извлечен, прежде чем мы сможем начать обработку первого.
Вопрос: существует ли реализация IEnumerable
, которая будет выполнять первый раз, как обычный результат запроса LINQ, но будет материализоваться в процессе, так что второй foreach
будет перебирать сохраненные значения?