RemoveAt (index) удаляет каждый альтернативный элемент в меню, а не тот, который проиндексирован - PullRequest
1 голос
/ 12 декабря 2011

У меня есть меню, и я отключаю определенные опции для определенной группы.Это выпадающее меню с около 10 человек.Когда я запускаю код, подобный этому

menuMain.Items[0].ChildItems.RemoveAt(0);
menuMain.Items[0].ChildItems.RemoveAt(1);
menuMain.Items[0].ChildItems.RemoveAt(2);
menuMain.Items[0].ChildItems.RemoveAt(3);
menuMain.Items[0].ChildItems.RemoveAt(4);
menuMain.Items[0].ChildItems.RemoveAt(5);

, что означает, что я хочу удалить первые 6 записей для этой одной группы, я получаю исключение в элементе № 5, говоря, что индекс находится вне диапазона.

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

removes 0th item
removes 2nd item
removes 4rd item
...
removes 10th item
removes 12th item (index not found)

Кто-нибудь знает, почему он ведет себя так?

Примечание: я проверилкод в режиме отладки, и он указывает на исправление пункта меню, который является как нечетным, так и четным, и он не прыгает на 2.

Ответы [ 3 ]

6 голосов
/ 12 декабря 2011

Да - представьте, что у вас изначально есть предметы [a, b, c, d, e, f, g, h, i, j, k, l, m].

Теперь вы звоните RemoveAt(0).Это удаляет первый элемент (a), оставляя вас с [b, c, d, e, f, g, h, i, j, k, l, m].

Теперь вы звоните RemoveAt(1).Это удаляет второй оставшийся предмет (c), оставляя вас с [b, d, e, f, g, h, i, j, k, l, m].

Теперь вы звоните RemoveAt(2).Это удаляет третий оставшийся элемент (e), оставляя вам: [b, d, f, g, h, i, j, k, l, m].

... и т.д.

Проблема в том, что вы думаетеиз индексов в оригинальном списке - не после «пока удалений».Если вы хотите удалить первые 6 записей, вы можете использовать:

for (int i = 0; i < 6; i++) {
    menuMain.Items[0].ChildItems.RemoveAt(0);
}
2 голосов
/ 12 декабря 2011

При удалении первого элемента (childItem) с индексом 0 второй элемент (индекс 1) занимает свое место с индексом 0.

Попробуйте удалить их в обратном порядке.

menuMain.Items[0].ChildItems.RemoveAt(5);
menuMain.Items[0].ChildItems.RemoveAt(4);
1 голос
/ 12 декабря 2011

Начните с 5 до 0. Когда вы удаляете элемент 0, элемент, находившийся на месте 1, перемещается на место 0, поэтому следующий вызов на удаление удаляет второй элемент.

...