Можно создать дубликат:
Can anyone explain IEnumerable and IEnumerator to me?В чем разница между IEnumerator и IEnumerable?
Каковы различия между IEnumerator и IEnumerable?
Можно создать дубликат:
Can anyone explain IEnumerable and IEnumerator to me?В чем разница между IEnumerator и IEnumerable?
Каковы различия между IEnumerator и IEnumerable?
IEnumerable представляет собой интерфейс, который определяет один метод GetEnumerator, который возвращает интерфейс IEnumerator, в свою очередь, позволяет доступ только для чтения к коллекции. Коллекция, которая реализует IEnumerable, может использоваться с оператором foreach.
Определение
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
@Rex M: Я думаю, что код имеет смысл. IEnumerable имеет метод GetEnumerator, который возвращает IEnumer * ator *, а не IEnumer * *. – Lernkurve
@ Lernkurve ответ был изменен, чтобы быть правильным после того, как я опубликовал свой комментарий. –
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();
}
}
IEnumerator
вещь, которая может перечислить: он имеет Current
собственность и MoveNext
и Reset
методы (которые в коде .NET вы, вероятно, не будет вызывать явно , хотя вы могли бы).
IEnumerable
- это вещь, которую можно перечислить ... это просто означает, что у нее есть метод GetEnumerator, который возвращает IEnumerator
.
Что вы используете? Единственная причина использовать IEnumerator
- это если у вас есть что-то, что имеет нестандартный способ перечисления (т. Е. Для возврата его отдельных элементов по одному), и вам нужно определить, как это работает. Вы должны создать новый класс, реализующий IEnumerator
. Но вам все равно нужно вернуть IEnumerator
в класс IEnumerable
.
Для взглянуть на то, что перечислитель (реализации IEnumerator<T>
) выглядит, вижу Enumerator<T>
класса, такие как те, которые содержатся в List<T>
, Queue<T>,
или Stack<T>
. Для просмотра класса, реализующего IEnumerable
, см. Любой стандартный класс коллекции.
Enumerator
показывает элементы в списке или коллекции. Каждый экземпляр Enumerator находится в определенном месте (1-й элемент, 7-й элемент и т. Д.) И может предоставить вам этот элемент (IEnumerator.Current
) или перейти к следующему (IEnumerator.MoveNext
). Когда вы пишете цикл foreach
на C#, компилятор генерирует код, который использует Enumerator.
Enumerable
- это класс, который может дать вам Enumerator
s.Он имеет метод под названием GetEnumerator
, который дает вам Enumerator
, который смотрит на его элементы. Когда вы пишете цикл foreach
на C#, код, который он генерирует, вызывает GetEnumerator
для создания Enumerator
, используемого в цикле.
Это сообщение в блоге довольно неточно. – SLaks
Duplicate: http://stackoverflow.com/questions/558304/can-anyone-explain-ienumerable-and-ienumerator-to-me –