Подобный BlackTigerX "для", я собирался предложить
for /d /r . %d in (_svn) do @if exist "%d" rd /s/q "%d"
Интересный вопрос. Я считаю, что C #, конечно, принесет пользу . Однако это было бы нелегко добавить.
Это различие существует в C ++ из-за его гораздо более гибкой системы типов. В C # у вас нет надежного универсального способа клонирования объектов, который необходим для представления прямых итераторов (для поддержки многопроходной итерации). И, конечно же, чтобы это было действительно полезно, вам также потребуется поддержка двунаправленных итераторов / перечислителей с произвольным доступом. И для того, чтобы все они работали без сбоев, вам действительно нужна какая-то форма утиной печати, как в шаблонах C ++.
В конечном счете, рамки этих двух концепций различаются.
В C ++ итераторы должны представлять все, что вы нужно знать о диапазоне значений. Учитывая пару итераторов, я не t требуется оригинальный контейнер. Я могу сортировать, искать, манипулировать и копировать элементы сколько захочу. Исходный контейнер отсутствует.
В C # перечислители не предназначены для того, чтобы делать так много. В конечном счете, они просто предназначены для того, чтобы позволить вам проходить последовательность линейным образом.
Что касается Reset ()
, широко признано, что было ошибкой добавлять его с самого начала. . Если бы это сработало и было реализовано правильно, то да, вы могли бы сказать, что ваш перечислитель был аналогичен прямым итераторам, но в целом лучше игнорировать его как ошибку. И тогда все перечислители похожи только на итераторы ввода.
К сожалению.
В C # перечислители не предназначены для стольких функций. В конечном счете, они просто предназначены для того, чтобы позволить вам проходить последовательность линейным образом.
Что касается Reset ()
, широко признано, что было ошибкой добавлять его с самого начала. . Если бы это сработало и было реализовано правильно, то да, вы могли бы сказать, что ваш перечислитель был аналогичен прямым итераторам, но в целом лучше игнорировать его как ошибку. И тогда все перечислители похожи только на итераторы ввода.
К сожалению.
В C # перечислители не предназначены для стольких функций. В конечном счете, они просто предназначены для того, чтобы позволить вам проходить последовательность линейным образом.
Что касается Reset ()
, широко признано, что было ошибкой добавлять его с самого начала. . Если бы это сработало и было реализовано правильно, то да, вы могли бы сказать, что ваш перечислитель был аналогичен прямым итераторам, но в целом лучше игнорировать его как ошибку. И тогда все перечислители похожи только на итераторы ввода.
К сожалению.
можно сказать, что ваш перечислитель аналогичен прямым итераторам, но в целом лучше игнорировать его как ошибку. И тогда все перечислители похожи только на итераторы ввода.К сожалению.
можно сказать, что ваш перечислитель аналогичен прямым итераторам, но в целом лучше игнорировать его как ошибку. И тогда все перечислители похожи только на итераторы ввода.К сожалению.
Сброс
был большой ошибкой. Я вызываю махинации на Reset
. На мой взгляд, правильный способ отразить различие, которое вы проводите между «итераторами вперед» и «итераторами ввода» в системе типов .NET, - это различать IEnumerable
и IEnumerator.
.
См. Также этот ответ , где Эрик Липперт из Microsoft (в неофициальном порядке, без сомнения, моя точка зрения состоит только в том, что у него больше полномочий, чем у меня, чтобы утверждают, что это была ошибка дизайна), делает то же самое в комментариях. См. Также его замечательный блог .
Я так не думаю. Я бы назвал IEnumerable
прямым итератором и итератором ввода. Это не позволяет вам двигаться назад или изменять базовую коллекцию. С добавлением ключевого слова foreach
итераторы почти всегда остаются незамеченными.
Мнение: Разница между итераторами ввода ( получить каждый ) и итераторами вывода ( сделать что-то с каждым из них ) слишком тривиальна, чтобы оправдать добавление в структуру. Кроме того, чтобы создать итератор вывода, вам необходимо передать делегат итератору. Итератор ввода кажется более естественным программистам на C #.
Также есть IList
, если программисту нужен произвольный доступ.
Coming from the C# perspective:
You almost never use IEnumerator
directly. Usually you do a foreach
statement, which expects a IEnumerable
.
IEnumerable _myCollection;
...
foreach (var item in _myCollection) { /* Do something */ }
You don't pass around IEnumerator
either. If you want to pass an collection which needs iteration, you pass IEnumerable
. Since IEnumerable
has a single function, which returns an IEnumerator
, it can be used to iterate the collection multiple times (multiple passes).
There's no need for a Reset()
function on IEnumerator
because if you want to start over, you just throw away the old one (garbage collected) and get a new one.