Как знать, достиг ли перечислитель конца набора в C#?

Я портирую библиотеку от C++ до C#. Старая библиотека использует векторы от C++, и в C# я использую универсальные Словари, потому что они - на самом деле хорошая структура данных для того, что я делаю (каждый элемент имеет идентификатор, затем я просто использую использование TypeDictionary = Dictionary<String, Type>;). Теперь, в C# кодируют, я использую цикл как этот

TypeDictionary.Enumerator tdEnum = MyTypeDictionary.GetEnumerator();

while( tdEnum.MoveNext() ) 
{
   Type element = typeElement.Current.Value;

   // More code here
}

выполнить итерации через элементы набора. Проблема состоит в том, что в особенности случаи, которые я должен проверить, достиг ли определенный перечислитель конца набора в C++, я сделал бы проверку как это:

if ( tdEnum == MyTypeDictionary.end() ) // More code here

Но я просто не знаю, как обработать эту ситуацию в C#, каких-либо идеях?

Спасибо
Tommaso

5
задан tunnuz 26 April 2010 в 14:14
поделиться

4 ответа

Вот довольно простой способ сделать это.

bool hasNext = tdEnum.MoveNext();
while (hasNext) {
    int i = tdEnum.Current;
    hasNext = tdEnum.MoveNext();
}

Я нашел онлайн-руководство, которое также может помочь вам понять, как это работает.

http://www.c-sharpcorner.com/UploadFile/prasadh/Enumerators11132005232321PM/Enumerators .aspx

12
ответ дан 18 December 2019 в 06:49
поделиться

Вы знаете, что находитесь в конце итератора, когда MoveNext () возвращает false . В противном случае вам необходимо перейти на более описательную структуру данных, например IList .

4
ответ дан 18 December 2019 в 06:49
поделиться

У меня есть класс «умного итератора» в MiscUtil , который может вам пригодиться. Это позволяет вам проверить, смотрите ли вы в данный момент на начало или конец последовательности, а также на индекс внутри последовательности. См. Страницу использования для получения дополнительной информации.

Конечно, в большинстве случаев вы можете просто сделать это вручную, используя результат MoveNext () , но иногда бывает полезна дополнительная инкапсуляция.

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

4
ответ дан 18 December 2019 в 06:49
поделиться

Переходя с C ++, возможно, вы не в курсе синтаксиса C #. Возможно, вы могли бы просто использовать конструкцию foreach, чтобы полностью избежать проверки. Следующий код будет выполнен один раз для каждого элемента в вашем словаре:

foreach (var element in MyTypeDictionary)
{
    // More code here
}
1
ответ дан 18 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

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