C#里我写了一段清除ListBok里面重复的项的代码,但是不够简洁,数据量大了就卡死了,求指点优化

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

}

不知道你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毫秒


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


温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-08
string[] test = new string[listBox1.Items.Count];
listBox1.Items.CopyTo(test, 0);

listBox1.Items.Clear();

test.Distinct().ToList().ForEach(c => listBox1.Items.Add(c));
第2个回答  2013-07-08
把button6_Click(null,null);去掉追问

    去掉过后点一次清除不完 得多清几次

     

C#里我写了一段清除ListBok里面重复的项的代码,但是不够简洁,数据量大...
第二种方式,是通过建立一个Dictonary对象来缓存以出现过的值,在循环过程中把所有包含在缓存中的项都删除:private void button2_Click(object sender, EventArgs e){ ListBox.ObjectCollection items = this.listBox1.Items; Dictionary exstis = new Dictionary(); for (int i = count -...

...还有就是看不懂里面的代码 需要怎样去学 谢谢!
printf("列表是否为空 %d\\n", list_empty(&my_list_head)); return 0; } C语言写的经典代码经常会用这种“过度简洁”的语法,初学之后会看得云里雾里的。如果你能看懂,又会有一个更大的问题——这个list_head结构体里面,没有数据。自定义数据应该放在哪呢?这又需要深一步研究了。 稍微高深点的比如任意...

如何解决C#中_system~.ini文件缺失问题?
答:如果要输入的生僻字在cad字库里不存在,常用的解决办法是把该文字做成一个图块,然后给它定义一个编码,做成一个符号来解决。8、cass的注册命令是?答:cass试用版注册成正式版的命令是:regi 关注并星标《测绘之家》微信公众号,获取更多测量技术干货!9、如何在cass中设置点的样式?答:在AutoCAD和cass中,设置点样式...

java学习路线
Java学习路线一般有以下几个阶段:第一阶段,JavaSE基础:Java环境搭建、Java流程控制语句-for循环、switch选择判断、循环嵌套、数组拷贝等。第二阶段,JavaWeb:MySQL安装、管理、创建数据库、MySQLUPDATE查询、Mysql高级操作等。第三阶段,Java高级框架-SSH:Struts2异常处理、Struts2+Log4j集成、Struts2和JSO...

我的电脑里的java程序是不是重复了?系统是64位的,那个后缀是24的是...
不能,一个对象的一个synchronized方法只能由一个线程访问。48.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?答:都不能。49.List, Set, Map是否继承自Collection接口?答:List,Set是Map不是50.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()?

相似回答