我如何使用第二方法代替第一?
首先 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]);
}
}
}
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);
}
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);
}
}
}
答案 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],你的循环就会出现:
希望这会有所帮助:)