#c# #list #c#-4.0 #.net-4.5
#c# #Список #c #-4.0 #.net-4.5
Вопрос:
У меня есть этот метод ниже, который перебирает IList для создания ежегодных конференций.
Цикл работает, за исключением того, что он всегда пропускает последнюю конференцию в IList.
Я не могу понять, почему он это делает.
Я пробовал различные исправления, но они всегда заканчиваются созданием бесконечного цикла.
Я думаю, мне просто нужна еще одна пара глаз, чтобы взглянуть на это.
Я опустил несколько мелких деталей, но основная структура цикла есть.
Спасибо!
public static IEnumerable<YearEvents> AnnualConferences(IList<conference> conferences)
{
//if list is empty, get out
if (conferences.Count == 0)
{
yield break;
}
var position = 0;
var confExists = GetConf();
while (position < conferences.Count)
{
if (confExists)
{
CreateConferenceTitle(conferences[position].Title);
position ;
}
else
{
yield return
conferences[position].CreateConference();
break;
}
}
position = position % conferences.Count;
var stopPos = conferences.Count - 1;
do
{
var startPos = position;
var nextPos = (position 1) % conferences.Count;
while (nextPos != stopPos)
{
CreateConferenceTitle(conferences[position].Title);
position = nextPos;
nextPos = (position 1) % conferences.Count;
}
yield return
conferences[position].CreateConference();
position = nextPos;
} while (position != stopPos);
}
Ответ №1:
Вы присваиваете новое значение position
after yield return
.
yield return conferences[position].CreateConference();
position = nextPos;
Эта строка
position = nextPos;
он даже не вызывается. Попробуйте переместить его перед return
инструкцией.
Ответ №2:
попробуйте проверить
var stopPos = conferences.Count - 1;
изменить на
var stopPos = conferences.Count;
и
while (position < conferences.Count)
изменить на
while (position <= conferences.Count)
Комментарии:
1. Спасибо. Я попробовал это, и это переходит в бесконечный цикл, потому что nextPos в конечном итоге сбрасывается обратно в 0 в самом конце, и весь процесс повторяется.