Лучшее, что вы можете сделать, это написать что-то, что хранит буфер (возможно, Queue<T>
) данных, потребляемых от одного, а не от другого (что может стать грязным / дорогим, если вы продвинетесь на один итератор на 1M позиций, но уйдете другой один). Я действительно думаю, что вам лучше переосмыслить дизайн, и просто использовать GetEnumerator()
(т. Е. Еще один foreach
) для повторного запуска - или буферизировать данные (если они короткие) в списке / массиве /whatever.
Ничего элегантного встроенного.
Обновление: возможно, интересный альтернативный дизайн здесь " PushLINQ "; вместо того, чтобы клонировать итератор, он позволяет нескольким «вещам» потреблять один и тот же поток данных одновременно .
В этом примере (снято со страницы Джона) мы вычисляем несколько агрегатов параллельно:
// Create the data source to watch
DataProducer<Voter> voters = new DataProducer<Voter>();
// Add the aggregators
IFuture<int> total = voters.Count();
IFuture<int> adults = voters.Count(voter => voter.Age >= 18);
IFuture<int> children = voters.Where(voter => voter.Age < 18).Count();
IFuture<int> youngest = voters.Min(voter => voter.Age);
IFuture<int> oldest = voters.Select(voter => voter.Age).Max();
// Push all the data through
voters.ProduceAndEnd(Voter.AllVoters());
// Write out the results
Console.WriteLine("Total voters: {0}", total.Value);
Console.WriteLine("Adult voters: {0}", adults.Value);
Console.WriteLine("Child voters: {0}", children.Value);
Console.WriteLine("Youngest vote age: {0}", youngest.Value);
Console.WriteLine("Oldest voter age: {0}", oldest.Value);