Вопрос

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

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

Это было полезно?

Решение

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<T>.

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

Чтобы узнать, как выглядит перечислитель (реализующий <=>), посмотрите любой класс <=>, например, в <=>, <=> или <=>. Посмотрите на класс, реализующий <=>, см. Любой стандартный класс коллекции.

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

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

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();
        }
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top