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