现在我有一个DataSet.Tables[0],里面大约有7万行字符串数据
里面有重复,我要做的就是把每个字符串出现的次数统计出来并删除重复的,把最后的结果显示在另外以个DataGrid中
代码如下:
            dt2 = new DataTable();
            dt2 = ds.Tables[0].Copy();
            int i, j, sameNum;
            sameNum = 1;
            for (i = 0; i < dt2.Rows.Count - 1; i++)
            {
                for (j = i + 1; j < dt2.Rows.Count; j++)
                {
                    if (dt2.Rows[i][1].Equals(dt2.Rows[j][1]))
                    {
                        sameNum++;
                        dt2.Rows[j].Delete();
                    }
                }
                dt2.Rows[i][2] = sameNum;
                sameNum = 1;                progressBar1.Value = (i * 100) / dt2.Rows.Count;
            }
            progressBar1.Value = 0;
            dataGrid3.DataSource = dt2;
这样做的后果就是
1.处理速度极慢
2.运行中如果用鼠标点移动一下窗体程序就像死了一样
3.progressBar1不能及时更新请各位高手帮帮我
小弟先谢过各位!

解决方案 »

  1.   

    你这种算法肯定不行,效率太低了。首先在内层循环中,dt2.Rows[i][1] 应该先把结果缓存起来,不用每次计算。其次可以考虑用Hash表的方式提高比较效率
      

  2.   

    谢谢runrunrun(一条不会游泳の鱼) 
    性能问题已经解决
    采用HashTable后原来1万行的数据由44秒缩短到0.18秒,真的太感谢你了
    修改后的程序如下:
                Hashtable hashTable = new Hashtable();
                int i;
                string tempStr;
                for (i = 0; i < dt2.Rows.Count; i++)
                {
                    tempStr=dt2.Rows[i][1].ToString();
                    if (hashTable.Contains(tempStr))
                        hashTable[tempStr] = Int32.Parse(hashTable[tempStr].ToString()) + 1;
                    else
                        hashTable.Add(tempStr, 1);
                }
                progressBar1.Value = 0;
                DataTable temDt = new DataTable();
                temDt.Columns.Add("a",System.Type.GetType("System.Int32"));
                temDt.Columns.Add("b", System.Type.GetType("System.String"));
                temDt.Columns.Add("c", System.Type.GetType("System.Int32"));
                i = 1;
               foreach (DictionaryEntry de in hashTable)
               {
                   DataRow dr = temDt.NewRow();
                   dr[0] = i;
                   dr[1] = de.Key;
                   dr[2] = de.Value;
                   temDt.Rows.Add(dr);
                   i++;
               }
                dataGrid3.DataSource = temDt;