我怎样才能使用foreach方法而不是用于删除列表框方法的方法?

时间:2009-04-06 08:38:12

标签: c# .net asp.net

我如何使用第二方法代替第一

首先

(网络用户控制)

   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();

        }

秒(网络用户控制)

 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);
                    }
                }
        }

4 个答案:

答案 0 :(得分:3)

如果要删除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通常可以简化第一个查询。

答案 1 :(得分:0)

您可以先将值删除到列表中,然后通过remove函数运行它们。如果需要,可以进一步加强。

var removedValues = ItemOrderer2.Items
                    .Where(li => li.Selected)
                    .Select(li => li.Value).ToList();

foreach (var removedValue in removedValues) {
   ItemOrderer2.Remove(removedValue);
}

答案 2 :(得分:0)

您无法修改在foreach循环中迭代的集合。

话虽如此,似乎您正试图从ListBox中删除所选项目。你也可以使用类似的东西:

while(ItemOrderer2.SelectedItem != null)
{
    ItemOrderer2.Items.Remove(ItemOrderer2.SelectedItem);
}

答案 3 :(得分:0)

好吧,您无法对IList&lt;&gt;进行任何更改与foreach一样,只是因为它会改变其中的项目数量。

此外,您展示的第一种方法存在缺陷,因为计数可能从20开始,但如果您使用您的方法删除10项,则计数仍为20,您将超出IList&lt;&gt;

基本上,如果你想在迭代它时删除/添加东西,你必须做类似

的事情
for (int i = 0; i < ListBox1.Items.Count; i++)
{
   if (ListBox1.Items[i].Selected)
   {
      ListBox1.Items.RemoveAt(i)
      i--;
   }
}

注意i--如果你删除任何东西。假设选择了项目[2],你的循环就会出现:

  1. 如果计数&gt; 0继续
  2. 如果选择了项目[0],则将其删除(不是)
  3. 增加我们的计数器
  4. 如果计数&gt; 1继续
  5. 如果选择了项目[1],则将其删除(不是)
  6. 增加我们的计数器
  7. 如果计数&gt; 2继续
  8. 选择
  9. 项目[2],将其删除(原样)
  10. 删除项目[2](现在,之前的项目[3]将是项目[2]
  11. 递减我们的柜台
  12. 增加我们的计数器
  13. 如果计数&gt; 2继续
  14. ...
  15. 希望这会有所帮助:)