при реализации итератора, какая разница между возвратом IEnumerator или IEnumerable? - PullRequest
4 голосов
/ 22 февраля 2012

При реализации итератора с использованием yield return, есть ли разница между возвратом IEnumerator и IEnumerable?

Ответы [ 3 ]

9 голосов
/ 22 февраля 2012

IEnumerable и IEnumerator - это две разные вещи.

IEnumerable<T> - это последовательность, которую можно повторять.

IEnumerator<T> - это объект, который возвращается IEnumerable<T> для однократной итерации последовательности.

В общем случае единственное место для возврата IEnumerator<T> - метод GetEnumerator().

yield return ведет себя одинаково для обоих типов, за исключением того, что метод итератора, который возвращает IEnumerable<T>, может выполняться несколько раз (каждый раз, когда последовательность перечисляется).
Для получения дополнительной информации о том, как это работает, см. Статью Джона Скита .

.
1 голос
/ 22 февраля 2012

Как разработчик функции итератора, она не влияет на вас.Это имеет большее значение для потребителя функции итератора.

В общем, люди предпочитают иметь объект IEnumerable<T>, потому что вы можете сделать цикл foreach для него, и если вам действительно нужен объект IEnumerator<T>затем вы можете получить его из метода IEnumerable<T> объекта *1005*.

0 голосов
/ 22 февраля 2012

Как упомянуто SLaks, Enumerator может быть повторен один раз, а IEnumerable может сгенерировать любое количество перечислителей, что позволяет многократно повторять базовую коллекцию.

На практике основное отличие состоит в том, чточто существует множество методов, таких как LINQ, и множество методов взаимодействия с коллекциями, которые все имеют дело с перечислителями, а не с перечислителями, поэтому перечислитель просто не сможет использоваться так широко.

...