我如何使用 foreach 方法而不是 for 方法并删除列表框的方法?
题
我该如何使用 第二 方法而不是 第一的?
首先(网络用户控制)
public void Remove()
{
int count = this.ListBox1.Items.Count;
for (int i = count - 1; i > -1; i--)
{
if (ListBox1.Items[i].Selected)
{
ListBox1.Items.Remove(ListBox1.Items[i]);
}
}
}
Test.aspx(第一个测试)
protected void btnRemove_Click(object sender, EventArgs e)
{
ItemOrderer2.Remove();
}
第二(Web用户控制)
public void Remove(string value)
{
ListItem li = new ListItem();
li = ListBox1.Items.FindByValue(value);
if (li != null)
{
this.ListBox1.Items.Remove(li);
}
Test.aspx(第二次测试)
protected void btnRemove_Click(object sender, EventArgs e)
{
// ItemOrderer2.Remove();
if (ItemOrderer2.Items.Count > 0)
foreach (ListItem li in ItemOrderer2.Items)
{
if (li.Selected)
{
ItemOrderer2.Remove(li.Value);
}
}
}
解决方案
你不能使用 foreach
如果您要删除里面的数据 foreach
- 它(故意)破坏了迭代器。
如果 for
有效,为什么要改变它?如果你是 绝望的 使用 foreach
, ,然后建立一个 分离 首先列出 - 例如:
List<ListItem> remove = new List<ListItem>();
foreach(ListItem li in ItemOrdere2.Items) {
if(li.Selected) remove.Add(li);
}
foreach(ListItem li in remove) {
ItemOrderer2.Remove(li); // or similar
}
如果可用,通常可以通过 LINQ 简化第一个查询。
其他提示
您可以先将要删除的值放入列表中,然后通过删除函数运行它们。如果需要,可以进一步增强这一点。
var removedValues = ItemOrderer2.Items
.Where(li => li.Selected)
.Select(li => li.Value).ToList();
foreach (var removedValue in removedValues) {
ItemOrderer2.Remove(removedValue);
}
您无法修改在 foreach 循环中迭代的集合。
话虽如此,您似乎正在尝试从列表框中删除所选项目。你也可以使用类似的东西:
while(ItemOrderer2.SelectedItem != null)
{
ItemOrderer2.Items.Remove(ItemOrderer2.SelectedItem);
}
好吧,您不能使用 foreach 对 IList<> 进行任何更改,因为它会更改其中的项目数。
另外,您展示的第一种方法是有缺陷的,因为 count 可能从 20 开始,但如果您用您的方法删除 10 个项目,count 仍将是 20,并且您将超出 IList<> 的范围
基本上,如果你想在迭代时删除/添加东西,你必须做类似的事情
for (int i = 0; i < ListBox1.Items.Count; i++)
{
if (ListBox1.Items[i].Selected)
{
ListBox1.Items.RemoveAt(i)
i--;
}
}
如果删除任何内容,请注意 i--。假设选择了 item[2],您的循环将进行:
- 如果计数 > 0 则继续
- 如果选择了 item[0],则将其删除(不是)
- 增加我们的计数器
- 如果 Count > 1 则继续
- 如果选择了 item[1],则将其删除(不是)
- 增加我们的计数器
- 如果 Count > 2 则继续
- item[2] 被选中,将其删除(它是)
- 删除 item[2] (现在,之前的 item[3] 将变为 item[2]
- 减少我们的计数器
- 增加我们的计数器
- 如果 Count > 2 则继续
- ...
希望这可以帮助 :)
不隶属于 StackOverflow