Czy istnieje implementacja IEnumerable, która tylko raz iteruje po źródle (np. LINQ)

Opatrzonyitems jest wynikiem wyrażenia q LINQ:

var items = from item in ItemsSource.RetrieveItems()
            where ...

Przypuśćmy, że generowanie każdego elementu zajmuje trochę czasu bez negligeble.

Możliwe są dwa tryby działania:

Za pomocąforeach pozwoliłoby na rozpoczęcie pracy z elementami na początku kolekcji znacznie wcześniej niż te, które w końcu staną się dostępne. Jeśli jednak chcemy później ponownie przetworzyć tę samą kolekcję, będziemy musieli skopiować ją:

var storedItems = new List<Item>();
foreach(var item in items){
    Process(item);
    storedItems .Add(item);
}

// Later
foreach(var item in storedItems){
    ProcessMore(item);
}

Bo gdybyśmy właśnie to zrobiliforeach(... in items) następnietemsSource.RetrieveItems() zostanie ponownie wezwany.

Możemy użyć.ToList() z góry, ale to zmusiłoby nas do czekania na odzyskanie ostatniego przedmiotu, zanim moglibyśmy rozpocząć przetwarzanie pierwszego.

Pytanie: Czy jest tamIEnumerable implementacja, która wykonałaby iterację po raz pierwszy, jak zwykły wynik zapytania LINQ, ale zmaterializowałaby się w procesie tak, że drugaforeach przejdzie przez zapisane wartości?

questionAnswers(3)

yourAnswerToTheQuestion