这样添加感觉是没什么问题的 list1的多选到list2
多选完要删除list1的选中的内容 就报错了
不知道怎么解决。。。
希望有人能帮帮解答解答。。。
foreach 集合删除要注意,应为集合删除的动态变化的,再通过脚标,或者循环访问会出问题。
楼上的朋友虽然改成for循环了,不报错了。但是逻辑上要注意。我们不是把代码改成不报错。这样删除处理一样会有问题。
思路,把所有选中的 放入一个list中。再循环list,再删除
var list=new List<xx>()
foreach(var a in xxx){
if(a 选中)
list.add(a);
}
或者
var list = xxx.where(r=>条件).ToList();
//删除
xxx.RemoveRange(list); //这里改过,手写的少写了个e
兄弟,我这种删除方式是可以的,逻辑上也是可以的,删除了当前的一项,就把当前的索引减1,下轮循环就会去判断下一个元素。你写的也不错,我写的这种楼主都用不上了,因为没有那个isselected属性,你写的适用范围比较广。不过我写的比较简洁。
感觉超纲了,可以讲的再详细点吗... 我没学过你举到的var list=new List<XXX> 之类的,看着不懂= =
@upze: 2010兄说的可以,你看看有没有RemoveRang方法,可以先把要删除的记录下来,然后在调用这个方法
@会长: 你是楼上那位吗?你可以写个小demo运行一下就可以了。
你说你的简洁,我这个可以两行代码搞定。这个都不重要,重要的是逻辑关系。
你i++,删了东西后面又i--,你认为删除的一定就是继续的吗?我要删除1,3,5,7。你看看你这个结果是什么?
@upze: 只看这一行代码之类的你没有写过吗? List a=new List<int>(); 这种代码你没有写过吗?
@gw2010: 没…… 课外知识需要自行学习一下
@gw2010: 你是这个意思吗?我写了,你看看有啥毛病
using System;
using System.Collections.Generic;
namespace DeleteItemOfList
{
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int> {1, 2, 3, 4, 5, 6, 7};
List<int> want2DeleteList = new List<int> { 1, 3, 5, 7 };
Remove(list, want2DeleteList);
Show(list);
}
private static void Show(List<int> list)
{
foreach (var item in list)
{
Console.WriteLine(item);
}
Console.ReadLine();
}
private static void Remove(List<int> list, List<int> want2DeleteList)
{
for (int i = 0; i < list.Count; i++)
{
if (want2DeleteList.Contains(list[i]))
{
list.Remove(list[i--]);
}
}
}
}
}
@会长: 可以。确实可以。我搞错了。
List<string> list = new List<string> []; 这个[]里面可以等于listbox里面的各个项号内容吗。。。
提示已经说的很清楚了,不可已添加或删除正在用foreach遍历的列表中的元素
那有什么办法可以把那里面的内容添加到list2里面还可以把自己(list1)当前选中的删除呢。。。
@upze:
for(int i = 0;i < listbox1.items.count;i++)
{
if(listbox1.items[i].isselected = true)
{
listbox2.items.add(listbox1.items[i];
listbox1.items.remove(listbox1.items[i]);
i--;
}
}
我盲打的代码,看看有没有isselected属性,有的话可以这样写
@会长: 没有,应该是SelectedIndex != -1 add和remove也是listBox1.SelectedItem..我还是想怎么用foreach解决
循环结束了,直接removeall就行了
foreach不能乱用的结果。
1.改为for;
2.Items.ToList() 再foreach; ->构建了新集合,再去遍历。
此处可参见微软提供的不少集合 属性 实现,其为了不让调用者出错,使用的是第二种方式。
需用到反向遍历:
往listbox2中添加item元素,listbox1中减少item元素
foreach(listitem li in listbox1.items)
{
if(li.selected)
{
listbox2.items.add(li);
}
}
for (int i=listitem.items.count,i>0,i--)
{
if(listbox1.item[i-1].Selected)
{
listbox1.items.move(listbox1.items[i-1]);
}
}
你这个里面还是用到for了.
不过也确实可以
@upze: 用到反向遍历 就只能用for
@白芷若惊: foreach不能反向遍历吗?
@upze: foreach语句“逐个”提取集合中的元素,并对集合中的每个元素执行语句序列中的操作。
@upze: 所以不能啊
@白芷若惊: 好吧,谢谢解答!
一起RemoveAll吧;