Интерфейс IEnumerable
определяет класс, который может быть перечислен, то есть содержит элементы, к которым можно получить доступ через перечисление.
Интерфейсы IEnumerator
определяют класс, который может выполнять перечисление для последовательности элементов.
Различие состоит в том, что IEnumerable
означает "вы можете перечислить меня", где IEnumerator
выполняет задачу перечисления.
Чтобы уточнить немного, IEnumerable
предоставляет метод GetEnumerator
. Этот метод возвращает IEnumerator
, который вы затем можете использовать для выполнения перечисления. Обычно вы не имеете дело с этим методом самостоятельно, потому что ключевое слово foreach
обрабатывает его для вас.
foreach(int element in myList)
{
// Do some work...
}
Этот код на самом деле расширен для вас компилятором в это:
IEnumerator enumerator = myList.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
int element = (int)enumerator.Current;
// Do some work...
}
}
finally
{
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
Как видите, IEnumerator
используется здесь для выполнения перечисления через элементы.