Ответ 1

IEnumerable - это интерфейс, который определяет один метод GetEnumerator, который возвращает IEnumerator, что, в свою очередь, позволяет читать только доступ к коллекции. Коллекция, которая реализует IEnumerable, может использоваться с оператором foreach.

Определение

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

public object Current;
public void Reset();
public bool MoveNext();

пример кода с codebetter.com

Ответ 2

An IEnumerator - это вещь, которая может перечислять: она имеет свойство Current и методы MoveNext и Reset (которые в .NET-коде вы, вероятно, не будете явно вызывать, хотя могли бы).

An IEnumerable - это вещь, которую можно перечислить... это просто означает, что у нее есть метод GetEnumerator, который возвращает IEnumerator.

Что вы используете? Единственная причина использования IEnumerator заключается в том, что у вас есть что-то, что имеет нестандартный способ перечисления (т.е. Возврата его отдельных элементов один за другим), и вам нужно определить, как это работает. Вы создадите новый класс, реализующий IEnumerator. Но вам все равно нужно вернуть этот IEnumerator в класс IEnumerable.

Посмотрите, как выглядит счетчик (реализация IEnumerator<T>), см. любой класс Enumerator<T>, такой как те, что содержатся в List<T>, Queue<T>, или Stack<T>. Для просмотра класса, реализующего IEnumerable, см. Любой стандартный класс коллекции.

Ответ 3

An Enumerator показывает элементы в списке или коллекции. Каждый экземпляр Enumerator находится в определенной позиции (1-й элемент, 7-й элемент и т.д.) И может предоставить вам этот элемент (IEnumerator.Current) или перейти к следующему (IEnumerator.MoveNext). Когда вы пишете цикл foreach в С#, компилятор генерирует код, который использует Enumerator.

An Enumerable - это класс, который может дать вам Enumerator s. Он имеет метод под названием GetEnumerator, который дает вам Enumerator, который смотрит на его элементы. Когда вы пишете цикл foreach в С#, код, который он генерирует, вызывает GetEnumerator, чтобы создать Enumerator, используемый циклом.

Ответ 4

IEnumerable и IEnumerator оба являются интерфейсами. IEnumerable имеет только один метод с именем GetEnumerator. Этот метод возвращает (так как все методы возвращают что-то, включая void) другой тип, который является интерфейсом, а этот интерфейс - IEnumerator. Когда вы реализуете логику перечислителя в любом классе вашей коллекции, вы реализуете IEnumerable (либо универсальный, либо не универсальный). IEnumerable имеет только один метод, тогда как IEnumerator имеет 2 метода (MoveNext и Reset) и свойство Current. Для простоты понимания рассмотрим IEnumerable как блок, в котором находится IEnumerator (но не через наследование или ограничение). Смотрите код для лучшего понимания:

class Test : IEnumerable, IEnumerator
{
    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }

    public object Current
    {
        get { throw new NotImplementedException(); }
    }

    public bool MoveNext()
    {
        throw new NotImplementedException();
    }

    public void Reset()
    {
        throw new NotImplementedException();
    }
}