Цикл foreach при работе с коллекциями и массивами?
Вы перепутали понятия "коллекция" и "перечислитель".
Обычно коллекция хранит элементы, а перечислитель - ссылку на перечисляемую коллекцию и текущее положение в ней. Каждый раз, когда вы используете стандартную коллекцию (массив, список и т.д.) в foreach, создается новый перечислитель. Поэтому сбрасывать состояние не надо. Вы же сделали химеру из коллекции и ее собственного перечислителя (return this as IEnumerator), поэтому вам приходится сбрасывать состояние руками.
Это очень плохой код. Решение - не создавайте собственные коллекции вообще. Еще с C# 2.0 существуют универсальные обобщенные коллекции - List<T>, Dictionary<TKey, TValue> и множество других, которые следует использовать.
Enumerator обычно реализовывается в закрытом вложенном классе, в методах которого вы просто используете экземпляр вашей коллекции. Для написания полноценной коллекции на основе массива можно воспользоваться обобщенными интерфейсами ICollection<T> / IList<T>. Для словарей  - IDictionary<TKey, TValue> и т. д.  Не соглашусь с предыдущим решением "не создавайте собственные коллекции вообще" - коллекции нужно создавать, стандартные не всегда подходят для реализации некоторых моделей. Например, для WPF есть ObservableCollection<T>, а что если нужен отслеживаемый словарь?