В чем разница между 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


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 см. любой стандартный класс коллекции.


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

An 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();
        }
    }