Как правило, вам больше не нужно реализовывать IEnumerable самостоятельно. Есть множество встроенных классов в платформе, которые реализуют этот интерфейс различными способами, чтобы удовлетворить 99% ваших потребностей.
Однако, если вы хотите, метод IEnumerable, GetEnumerator () будет возвращать объект IEnumerator клиенту, вызывающему foreach. Этот объект Ienumerator является объектом, который отслеживает, какой элемент в коллекции является msgstr "один возвращается, когда foreach" повторяется ". Чтобы это работало, вы должны определить класс, который будет тем перечислителем (он должен реализовывать IEnumerator или, как правило, IEnumerator)
Как пример (для PersonCollection)
public IEnumerator GetEnumerator() { return new myTypeEnumerator(this); }
public class myTypeEnumerator : IEnumerator
{
int nIndex;
PersonCollection pers;
public myTypeEnumerator(PersonCollection myTypes)
{ pers = myTypes; nIndex = -1; }
public bool MoveNext() { return (++nIndex < pers.alPers.Count); }
public object Current { get { return (pers[nIndex]); } }
public void Reset() { nIndex = -1; }
}
Единственная разница между этой и универсальной версией заключается в том, что универсальная версия строго типизирована:
public IEnumerator<T> GetEnumerator() { return new myTypeEnumerator<T>(this); }
public class myTypeEnumerator<T> : IEnumerator<T>
{
int nIndex;
IList<T> tList;
public myTypeEnumerator(IList<T> listOfTs)
{
tList = listOfTs;
nIndex = -1;
}
public bool MoveNext() { return (++nIndex < tList.Count); }
public T Current { get { return (tList[nIndex]); } }
public void Reset() { nIndex = -1; }
}