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?