В чем разница между IEnumerator и IEnumerable? [дубликат]


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

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

4 85

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 - это класс, который может дать вам Enumerator s. он имеет метод под названием 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();
        }
    }