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