C#里我写了一段清除ListBok里面重复的项的代码,但是不够简洁,数据量大了就卡死了,求指点优化
privatevoidbutton6_Click(objectsender,EventArgse){CloseError();for(inti=0;i<listBox1....
private void button6_Click(object sender, EventArgs e) { CloseError(); for (int i = 0; i < listBox1.Items.Count-1; i++) { for (int j = i + 1; j < listBox1.Items.Count; j++) { string itemi = listBox1.Items[i].ToString(); string itemj = listBox1.Items[j].ToString(); if (itemi == itemj) { this.listBox1.Items.Remove(listBox1.Items[j]); button6_Click(null,null); } } }
} 展开
} 展开
3个回答
展开全部
不知道你freamwork版本有没有到3.5 以上,大体测试了一下,
第一种方式,跟你的代码基本一个思路,不过稍微优化了一下:
private void button1_Click(object sender, EventArgs e)
{
ListBox.ObjectCollection items = this.listBox1.Items;
for (int i = items.Count - 1; i >= 0; i--)
{
for (int j = items.Count - 1; j >=0 ; j--)
{
if (i != j && items[i].Equals(items[j]))
{
items.Remove(items[i]);
break;
}
}
}
}这中方式速度最慢,我用20000笔资料的时候,用时差不多9000多毫秒
第二种方式,是通过建立一个Dictonary对象来缓存以出现过的值,在循环过程中把所有包含在缓存中的项都删除:
private void button2_Click(object sender, EventArgs e)
{
ListBox.ObjectCollection items = this.listBox1.Items;
Dictionary<object, bool> exstis = new Dictionary<object, bool>();
for (int i = count - 1; i >= 0; i--)
{
if (exstis.ContainsKey(items[i]))
{
items.Remove(items[i]);
}
else
{
exstis.Add(items[i], true);
}
}
}这种方式速度快了一些,20000笔资料的时候,用时大概不到7000毫秒
第三种方式:用LINQ查询实现(这个可能就需要framework3.5以上版本了):
private void button3_Click(object sender, EventArgs e)
{
ListBox.ObjectCollection items = this.listBox1.Items;
var ie = from int o in items
group o by o ;
List<int> data = new List<int>();
foreach (var wordGroup in ie)
{
data.Add(wordGroup.Key);
}
items.Clear();
foreach (int i in data)
{
items.Add(i);
}
}从目前的测试结果看,好像就是这种方式最快,20000笔资料的时候,用时约300毫秒
大概就这样,测试的代码已经打包放到附件里了,需要的自己下载了测测看!
展开全部
string[] test = new string[listBox1.Items.Count];
listBox1.Items.CopyTo(test, 0);
listBox1.Items.Clear();
test.Distinct().ToList().ForEach(c => listBox1.Items.Add(c));
listBox1.Items.CopyTo(test, 0);
listBox1.Items.Clear();
test.Distinct().ToList().ForEach(c => listBox1.Items.Add(c));
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把button6_Click(null,null);去掉
追问
去掉过后点一次清除不完 得多清几次
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询