Я бы действительно подошел к этому наоборот; в то время как вы можете (согласно превосходному ответу Майка П) обернуть перечислитель, притворяясь перечислимым, есть некоторые вещи, которые вы действительно не можете сделать - например, это в надежде (хотя, если честно, не настаивал), что вы можете получить несколько перечислителей из перечислимого, идеально изолированного и повторяемого. Так что если я сделаю:
Assert.AreEqual(sequence.Sum(), sequence.Sum());
но если вы "подделаете" перечислитель в перечислимое, вторая последовательность будет пустой. Или, если вы делаете их параллельно - просто странно. И есть методы , которые обрабатывают их параллельно - рассмотрим:
Assert.IsTrue(sequence.SequenceEqual(sequence));
это работает оба перечислителя вперед одновременно , поэтому, если у вас только есть один перечислитель, вы довольно огорчены.
Там - это сброс счетчиков, но это в значительной степени ошибка проектирования и не должна использоваться (это даже формальное требование в спецификации, чтобы блоки итератора вызывали исключение, если вы его вызываете) .
Лучшим (IMO) вопросом является «как мне получить перечислитель из перечислимого», и в этом случае ответом является «вызов GetEnumerator (), и не забудьте поставить галочку, чтобы избавиться от итератора» - или, проще говоря, использовать foreach
».