首页 新闻 会员 周边

c# foreach 操作 listbox

0
悬赏园豆:10 [已解决问题] 解决于 2019-05-24 16:39

这样添加感觉是没什么问题的 list1的多选到list2

多选完要删除list1的选中的内容 就报错了

不知道怎么解决。。。
希望有人能帮帮解答解答。。。

c#
lizehaha的主页 lizehaha | 初学一级 | 园豆:106
提问于:2019-05-16 16:22
< >
分享
最佳答案
0

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

收获园豆:6
gw2010 | 小虾三级 |园豆:1487 | 2019-05-16 17:19

兄弟,我这种删除方式是可以的,逻辑上也是可以的,删除了当前的一项,就把当前的索引减1,下轮循环就会去判断下一个元素。你写的也不错,我写的这种楼主都用不上了,因为没有那个isselected属性,你写的适用范围比较广。不过我写的比较简洁。

会长 | 园豆:12401 (专家六级) | 2019-05-16 17:25

感觉超纲了,可以讲的再详细点吗... 我没学过你举到的var list=new List<XXX> 之类的,看着不懂= =

lizehaha | 园豆:106 (初学一级) | 2019-05-16 17:27

@upze: 2010兄说的可以,你看看有没有RemoveRang方法,可以先把要删除的记录下来,然后在调用这个方法

会长 | 园豆:12401 (专家六级) | 2019-05-16 17:58

@会长: 你是楼上那位吗?你可以写个小demo运行一下就可以了。
你说你的简洁,我这个可以两行代码搞定。这个都不重要,重要的是逻辑关系。
你i++,删了东西后面又i--,你认为删除的一定就是继续的吗?我要删除1,3,5,7。你看看你这个结果是什么?

gw2010 | 园豆:1487 (小虾三级) | 2019-05-17 08:46

@upze: 只看这一行代码之类的你没有写过吗? List a=new List<int>(); 这种代码你没有写过吗?

gw2010 | 园豆:1487 (小虾三级) | 2019-05-17 08:50

@gw2010: 没…… 课外知识需要自行学习一下

lizehaha | 园豆:106 (初学一级) | 2019-05-17 09:21

@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--]);
                }
            }
        }
    }
}
会长 | 园豆:12401 (专家六级) | 2019-05-17 09:39

@会长: 可以。确实可以。我搞错了。

gw2010 | 园豆:1487 (小虾三级) | 2019-05-17 10:32

List<string> list = new List<string> []; 这个[]里面可以等于listbox里面的各个项号内容吗。。。

lizehaha | 园豆:106 (初学一级) | 2019-05-17 16:12
其他回答(5)
1

提示已经说的很清楚了,不可已添加或删除正在用foreach遍历的列表中的元素

收获园豆:2
会长 | 园豆:12401 (专家六级) | 2019-05-16 16:27

那有什么办法可以把那里面的内容添加到list2里面还可以把自己(list1)当前选中的删除呢。。。

支持(0) 反对(0) lizehaha | 园豆:106 (初学一级) | 2019-05-16 16:28

@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属性,有的话可以这样写

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2019-05-16 16:35

@会长: 没有,应该是SelectedIndex != -1 add和remove也是listBox1.SelectedItem..我还是想怎么用foreach解决

支持(0) 反对(0) lizehaha | 园豆:106 (初学一级) | 2019-05-16 16:43
0

循环结束了,直接removeall就行了

收获园豆:1
jqw2009 | 园豆:2439 (老鸟四级) | 2019-05-17 08:38
0

foreach不能乱用的结果。
1.改为for;
2.Items.ToList() 再foreach; ->构建了新集合,再去遍历。

此处可参见微软提供的不少集合 属性 实现,其为了不让调用者出错,使用的是第二种方式。

收获园豆:1
花飘水流兮 | 园豆:13560 (专家六级) | 2019-05-17 11:12
0

需用到反向遍历:
往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]);
}
}

白芷若惊 | 园豆:189 (初学一级) | 2019-05-17 11:40

你这个里面还是用到for了.

支持(0) 反对(0) lizehaha | 园豆:106 (初学一级) | 2019-05-17 15:59

不过也确实可以

支持(0) 反对(0) lizehaha | 园豆:106 (初学一级) | 2019-05-17 16:00

@upze: 用到反向遍历 就只能用for

支持(0) 反对(0) 白芷若惊 | 园豆:189 (初学一级) | 2019-05-17 16:02

@白芷若惊: foreach不能反向遍历吗?

支持(0) 反对(0) lizehaha | 园豆:106 (初学一级) | 2019-05-17 16:03

@upze: foreach语句“逐个”提取集合中的元素,并对集合中的每个元素执行语句序列中的操作。

支持(0) 反对(0) 白芷若惊 | 园豆:189 (初学一级) | 2019-05-17 16:08

@upze: 所以不能啊

支持(0) 反对(0) 白芷若惊 | 园豆:189 (初学一级) | 2019-05-17 16:10

@白芷若惊: 好吧,谢谢解答!

支持(0) 反对(0) lizehaha | 园豆:106 (初学一级) | 2019-05-17 16:11
0

一起RemoveAll吧;

我性别男爱好女 | 园豆:218 (菜鸟二级) | 2019-05-21 18:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册