C# извлек бы выгоду из различий между видами перечислителей, как итераторы C++?

Подобный BlackTigerX "для", я собирался предложить

for /d /r . %d in (_svn) do @if exist "%d" rd /s/q "%d"

5
задан Community 23 May 2017 в 12:02
поделиться

4 ответа

Интересный вопрос. Я считаю, что C #, конечно, принесет пользу . Однако это было бы нелегко добавить.

Это различие существует в C ++ из-за его гораздо более гибкой системы типов. В C # у вас нет надежного универсального способа клонирования объектов, который необходим для представления прямых итераторов (для поддержки многопроходной итерации). И, конечно же, чтобы это было действительно полезно, вам также потребуется поддержка двунаправленных итераторов / перечислителей с произвольным доступом. И для того, чтобы все они работали без сбоев, вам действительно нужна какая-то форма утиной печати, как в шаблонах C ++.

В конечном счете, рамки этих двух концепций различаются.

В C ++ итераторы должны представлять все, что вы нужно знать о диапазоне значений. Учитывая пару итераторов, я не t требуется оригинальный контейнер. Я могу сортировать, искать, манипулировать и копировать элементы сколько захочу. Исходный контейнер отсутствует.

В C # перечислители не предназначены для того, чтобы делать так много. В конечном счете, они просто предназначены для того, чтобы позволить вам проходить последовательность линейным образом.

Что касается Reset () , широко признано, что было ошибкой добавлять его с самого начала. . Если бы это сработало и было реализовано правильно, то да, вы могли бы сказать, что ваш перечислитель был аналогичен прямым итераторам, но в целом лучше игнорировать его как ошибку. И тогда все перечислители похожи только на итераторы ввода.

К сожалению.

В C # перечислители не предназначены для стольких функций. В конечном счете, они просто предназначены для того, чтобы позволить вам проходить последовательность линейным образом.

Что касается Reset () , широко признано, что было ошибкой добавлять его с самого начала. . Если бы это сработало и было реализовано правильно, то да, вы могли бы сказать, что ваш перечислитель был аналогичен прямым итераторам, но в целом лучше игнорировать его как ошибку. И тогда все перечислители похожи только на итераторы ввода.

К сожалению.

В C # перечислители не предназначены для стольких функций. В конечном счете, они просто предназначены для того, чтобы позволить вам проходить последовательность линейным образом.

Что касается Reset () , широко признано, что было ошибкой добавлять его с самого начала. . Если бы это сработало и было реализовано правильно, то да, вы могли бы сказать, что ваш перечислитель был аналогичен прямым итераторам, но в целом лучше игнорировать его как ошибку. И тогда все перечислители похожи только на итераторы ввода.

К сожалению.

можно сказать, что ваш перечислитель аналогичен прямым итераторам, но в целом лучше игнорировать его как ошибку. И тогда все перечислители похожи только на итераторы ввода.

К сожалению.

можно сказать, что ваш перечислитель аналогичен прямым итераторам, но в целом лучше игнорировать его как ошибку. И тогда все перечислители похожи только на итераторы ввода.

К сожалению.

2
ответ дан 14 December 2019 в 13:40
поделиться

Сброс был большой ошибкой. Я вызываю махинации на Reset . На мой взгляд, правильный способ отразить различие, которое вы проводите между «итераторами вперед» и «итераторами ввода» в системе типов .NET, - это различать IEnumerable и IEnumerator. .

См. Также этот ответ , где Эрик Липперт из Microsoft (в неофициальном порядке, без сомнения, моя точка зрения состоит только в том, что у него больше полномочий, чем у меня, чтобы утверждают, что это была ошибка дизайна), делает то же самое в комментариях. См. Также его замечательный блог .

3
ответ дан 14 December 2019 в 13:40
поделиться

Я так не думаю. Я бы назвал IEnumerable прямым итератором и итератором ввода. Это не позволяет вам двигаться назад или изменять базовую коллекцию. С добавлением ключевого слова foreach итераторы почти всегда остаются незамеченными.

Мнение: Разница между итераторами ввода ( получить каждый ) и итераторами вывода ( сделать что-то с каждым из них ) слишком тривиальна, чтобы оправдать добавление в структуру. Кроме того, чтобы создать итератор вывода, вам необходимо передать делегат итератору. Итератор ввода кажется более естественным программистам на C #.

Также есть IList , если программисту нужен произвольный доступ.

-1
ответ дан 14 December 2019 в 13:40
поделиться

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.

1
ответ дан 14 December 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: