перебор IList и отсутствие последнего элемента списка

#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 в самом конце, и весь процесс повторяется.