问题描述
我想把listbox1里面的数据筛选出来,告诉用户这里面是15年31周的,32周的,n16年31周的。数据来源取得是“5322518115311CCB”中的1531,我本来是打算从listbox1筛选到listbox2取得是1531然后再用Substring分割成15,31感觉这个方法不是太好,求大牛给个好点的方法。还有点就是我再移除重复项的时候,为什么只能移除掉一个重复的呢?这是我的代码:privatevoidbutton1_Click(objectsender,EventArgse){for(inti=0;i<listBox1.Items.Count;i++){intstart=9,length=4;stringstr=listBox1.Items[i].ToString();stringstr2=str.Substring(start-1,length);//for(intj=0;j<listBox2.Items.Count;j++)//{//if(str2!=listBox2.Items[j].ToString())//{listBox2.Items.Add(str.Substring(start-1,length));//}//}}}privatevoidbutton3_Click(objectsender,EventArgse){for(inti=0;i<listBox2.Items.Count;i++){for(intj=i+1;j<listBox2.Items.Count;j++){if(listBox2.Items[i].Equals(listBox2.Items[j])){listBox2.Items.Remove(listBox2.Items[j]);}}}}
解决方案
解决方案二:
忘记上图片了
解决方案三:
有人解答下吗?
解决方案四:
首先,你数据本身是这种格式,除了做字符串截取没有别的办法其次,控件是用来输入和显示的,不是用来作为数据存储的,你应该直接从后台的数据源去获取数据(比如是数组还是list,你listBox1里的数据是哪里来的?)再次,筛选可以用linq,或者如果不会那么高大上的写法,自己写if(list.Contains(xxx))就可以判断list里是否已经包含了这个字符串,而不需要写双重for循环挨个去比较最后,删除集合的时候,你要从后往前删除,否则删除了最前面的,后面所有项的索引就全都变了,你相当于跳过了某个字符串而只删除了后面的字符串
解决方案五:
添加的方法也就那么回事,逻辑上差不多,只是你有些不需要的变量可以去掉。删掉重复项我帮你重写了一下privatevoidbutton3_Click(objectsender,EventArgse){vararr=listBox2.Items.Cast<object>().GroupBy(p=>p).Select(p=>p.Take(p.Count()-1)).SelectMany(p=>p);foreach(varainarr){listBox2.Items.Remove(a);}}
解决方案六:
你的list1内容放到list2里,根本不是什么筛选,而只不过是截取,这没有什么更好的办法但是你对list2的内容进行重复筛选的时候,可以不要先把全部的内容都放到list2里,而是直接判断里面是否已经有了重复项,有重复的就直接不要放进去,而不是先放进去,再删掉,费两遍事