Единственным формальным требованием является то, что у него есть метод с именем GetEnumerator()
, который возвращает что-то , которое имеет свойство SomeType Current {get;}
и метод bool MoveNext()
. Однако чаще всего это делается путем реализации интерфейса IEnumerable
/ IEnumerable<T>
. Действительно, ожидается , что вы будете реализовывать этот интерфейс (более старый метод действительно был задуман как предварительная оптимизация), и использование интерфейса позволит потребителям использовать вашу коллекцию с такими вещами, как LINQ и collection- инициализаторы.
В интересных случаях самый простой способ реализовать это через "блок итератора". Например:
class Foo : IEnumerable<int> {
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
public IEnumerator<int> GetEnumerator() {
yield return 16;
yield return 12;
yield return 31;
// ^^ now imagine the above was a loop over some internal structure -
// for example an array, list, linked-list, etc, with a "yield return"
// per item
}
}