Использование цикла для выбора/удаления параметров из списка

Итак, в основном я использую цикл FOR для добавления и удаления параметров из списка. Он работает правильно, когда выбран 1 вариант (либо из удаления, либо из выбора), и он работает правильно, когда я выбираю два отдельных параметра (например, элемент [0] и элемент [4]).

Однако у меня возникают проблемы, когда я пытаюсь выбрать все параметры или когда я выбираю два элемента, расположенных рядом ([2], [3].. и т. д.)

Вот мой цикл для функции выбора:

protected void btnSelect_Click(object sender, EventArgs e)
{
    for (int intCounter = 0; intCounter < lbSnacks.Items.Count; intCounter++)
    {
        if (lbSnacks.Items[intCounter].Selected) // if the snack is selected
        { // add the listitem to the lbSelected listbox
            lbSelected.Items.Add(lbSnacks.Items[intCounter]);
        }

    }
    for (int intCounter = 0; intCounter < lbSnacks.Items.Count; intCounter++)
    {
        if (lbSnacks.Items[intCounter].Selected) // if the snack is selected
        { // add the listitem to the lbSelected listbox
            lbSnacks.Items.Remove(lbSnacks.Items[intCounter]);
        }

    }
}

Ошибка в основном берет элемент и помещает его в список «выбранных», но оставляет один из двух вариантов в исходном поле «закуски».

Любые идеи?


person Ryan Ring    schedule 17.03.2014    source источник


Ответы (1)


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

Существуют различные способы справиться с этим. Самый простой - просто зациклиться назад:

for (int intCounter = lbSnacks.Items.Count-1; intCounter >= 0; intCounter--)
{
    if (lbSnacks.Items[intCounter].Selected) // if the snack is selected
    { // add the listitem to the lbSelected listbox
        lbSelected.Items.Add(lbSnacks.Items[intCounter]);
        lbSnacks.Items.Remove(lbSnacks.Items[intCounter]);
    }
}

Таким образом, когда предметы «смещаются», это не имеет значения, поскольку вы уже имели дело с этими предметами.

person Reed Copsey    schedule 17.03.2014
comment
Большое спасибо Рид! Я борюсь с циклами обучения, но я практиковался и начал осваивать это. - person Ryan Ring; 17.03.2014