我如何使用 foreach 方法而不是 for 方法并删除列表框的方法?

StackOverflow https://stackoverflow.com/questions/720625

  •  23-08-2019
  •  | 
  •  

我该如何使用 第二 方法而不是 第一的?

首先(网络用户控制)

   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],您的循环将进行:

  1. 如果计数 > 0 则继续
  2. 如果选择了 item[0],则将其删除(不是)
  3. 增加我们的计数器
  4. 如果 Count > 1 则继续
  5. 如果选择了 item[1],则将其删除(不是)
  6. 增加我们的计数器
  7. 如果 Count > 2 则继续
  8. item[2] 被选中,将其删除(它是)
  9. 删除 item[2] (现在,之前的 item[3] 将变为 item[2]
  10. 减少我们的计数器
  11. 增加我们的计数器
  12. 如果 Count > 2 则继续
  13. ...

希望这可以帮助 :)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top