У меня есть класс C #, который должен обрабатывать последовательность элементов (IEnumerable<T>
) в нескольких методах, поэтому я не могу просто foreach
внутри метода.Я звоню .GetEnumerator()
и передаю это IEnumerator<T>
, и это прекрасно работает, давая мне гибкость, необходимую мне при циклическом просмотре одной последовательности.
Теперь я хочу позволить другим добавить логику в этот процесс.Самый естественный способ сделать это - дать им интерфейс с методом, который принимает IEnumerator<T>
.Легко, сделано, и это работает.
Но я обеспокоен тем, что это анти-паттерн.Они должны знать, что IEnumerator<T>
уже вызвал .MoveNext()
, поэтому они могут просто получить доступ к .Current
.Кроме того, я не вижу прецедента для использования IEnumerator<T>
в интерфейсах, которые будут реализованы.
- Какие подводные камни я не рассматриваю?
- Есть ли другой шаблон, который позволит мне этотот же самый эффективный механизм (т.е. я не хочу, чтобы несколько копий создавались / уничтожались) без показа самого
IEnumerator<T>
?
Обновление: Как яупомянуто в комментарии ниже: я хочу что-то общее Stream<T>
.Мне нужно иметь возможность эффективно видеть следующий элемент (IEnumerator.Current
-> .Peek()
) и потреблять его (IEnumerator<T>.MoveNext()
-> .Pop()
).
Я использовал IEnumerator<T>
, потому что он соответствуетинтерфейс счета мудрый.Я предпочитаю использовать общие типы BCL, когда они подходят, но мне показалось, что я злоупотреблял этим.
Итак, вопрос 3) Есть ли класс, который соответствует этой потребности?Или я должен просто создать свой собственный поток, который лениво выполняет IEnumerator<T>
внутри?Тогда это было бы полностью заключено в капсулу.Я бы не хотел использовать многие из существующих коллекций, поскольку они имеют внутреннее хранилище, тогда как я хотел бы, чтобы хранилище было IEnumerable<T>
iteslf.
ОК, похоже, что консенсус заключается в том, чтосделайте, чтобы IEnumerator<T>
часто был ValueType
, а также не зная априори о состоянии IEnumerator<T>
, что, как правило, плохая идея обойти его.
Лучшее предложение, которое у меня естьСлышал, чтобы создать свой собственный класс, который проходит вокруг.Любые другие предложения?