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