Я портирую библиотеку от 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
Вот довольно простой способ сделать это.
bool hasNext = tdEnum.MoveNext();
while (hasNext) {
int i = tdEnum.Current;
hasNext = tdEnum.MoveNext();
}
Я нашел онлайн-руководство, которое также может помочь вам понять, как это работает.
http://www.c-sharpcorner.com/UploadFile/prasadh/Enumerators11132005232321PM/Enumerators .aspx
Вы знаете, что находитесь в конце итератора, когда MoveNext ()
возвращает false
. В противном случае вам необходимо перейти на более описательную структуру данных, например IList
.
У меня есть класс «умного итератора» в MiscUtil , который может вам пригодиться. Это позволяет вам проверить, смотрите ли вы в данный момент на начало или конец последовательности, а также на индекс внутри последовательности. См. Страницу использования для получения дополнительной информации.
Конечно, в большинстве случаев вы можете просто сделать это вручную, используя результат MoveNext ()
, но иногда бывает полезна дополнительная инкапсуляция.
Обратите внимание, что по необходимости этот итератор всегда фактически потреблял на одно значение больше, чем выдал, чтобы знать, достиг ли он конца. В большинстве случаев это не проблема, но иногда при отладке могут возникать странные ощущения.
Переходя с C ++, возможно, вы не в курсе синтаксиса C #. Возможно, вы могли бы просто использовать конструкцию foreach, чтобы полностью избежать проверки. Следующий код будет выполнен один раз для каждого элемента в вашем словаре:
foreach (var element in MyTypeDictionary)
{
// More code here
}