RemoveAt(index)删除菜单中的每个备用项而不是索引的项

Ham*_*han 1 asp.net menu menuitem

我有一个菜单,我禁用某些组的某些选项.它是下拉菜单,大约有10个entriees.当我运行这样的代码

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);
Run Code Online (Sandbox Code Playgroud)

这意味着我想删除这一组的前6个条目,我在第5项中得到例外,说索引超出范围.

我发现上面的代码从菜单中删除了所有其他项目,而不是被引用的项目.

removes 0th item
removes 2nd item
removes 4rd item
...
removes 10th item
removes 12th item (index not found)
Run Code Online (Sandbox Code Playgroud)

有谁知道它为什么会这样?

注意:我在调试模式下检查了代码,它确实指向了正确的菜单项,它既奇数又偶数,并且不会跳过2.

Jon*_*eet 6

是的 - 想象一下你最初有物品[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);
}
Run Code Online (Sandbox Code Playgroud)