В чем разница между IEnumerator и IEnumerable?

Возможный дубликат:
Может кто-нибудь объяснить мне IEnumerable и IEnumerator?

Каковы различия между IEnumerator и IEnumerable?

4 ответа

Решение

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

Определение

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

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

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

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

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

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

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

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

Enumerable это класс, который может дать вам Enumerators. У него есть метод GetEnumerator который дает вам Enumerator это смотрит на его пункты. Когда вы пишете foreach цикл в C#, код, который он генерирует вызовы GetEnumerator создать Enumerator используется в цикле.

IEnumerable и IEnumerator оба являются интерфейсами. IEnumerable имеет только один метод с именем GetEnumerator. Этот метод возвращает (так как все методы возвращают что-то, включая void) другой тип, который является интерфейсом, а этот интерфейс - IEnumerator. Когда вы реализуете логику перечислителя в любом классе вашей коллекции, вы реализуете IEnumerable (либо универсальный, либо не универсальный). IEnumerable имеет только один метод, тогда как IEnumerator имеет 2 метода (MoveNext и Reset) и свойство Current. Для простоты понимания рассмотрим IEnumebale блок, в котором находится 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();
        }
    }
Другие вопросы по тегам