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); } } }

}
展开
 我来答
zhfto
2013-07-08 · TA获得超过563个赞
知道小有建树答主
回答量:107
采纳率:0%
帮助的人:215万
展开全部

不知道你freamwork版本有没有到3.5 以上,大体测试了一下,

  1. 第一种方式,跟你的代码基本一个思路,不过稍微优化了一下:

    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多毫秒

  2.    第二种方式,是通过建立一个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毫秒

  3. 第三种方式:用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毫秒


大概就这样,测试的代码已经打包放到附件里了,需要的自己下载了测测看!


talencz
2013-07-08 · 超过52用户采纳过TA的回答
知道小有建树答主
回答量:163
采纳率:0%
帮助的人:140万
展开全部
string[] test = new string[listBox1.Items.Count];
listBox1.Items.CopyTo(test, 0);

listBox1.Items.Clear();

test.Distinct().ToList().ForEach(c => listBox1.Items.Add(c));
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友780c2a5
2013-07-08 · 超过43用户采纳过TA的回答
知道小有建树答主
回答量:129
采纳率:0%
帮助的人:111万
展开全部
把button6_Click(null,null);去掉
追问
  1. 去掉过后点一次清除不完 得多清几次

     

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式