首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

过滤table重复数据,该如何处理

2013-11-05 
过滤table重复数据本帖最后由 xiongxing318 于 2013-10-09 15:45:21 编辑现有表A数据量大概2W左右,是从exe

过滤table重复数据
本帖最后由 xiongxing318 于 2013-10-09 15:45:21 编辑 现有表A数据量大概2W左右,是从execl里面导入进来的。表B是从表A  Copy来的。
A: 手机号码               发送内容    Index    错误信息    
     13800000001         200       1
    13800000002         200       2
    13800000002         15        3
    13800000003         220       4
        .                .
        .                .
    13800019999         550      19999  

想要的结果:我要把手机号码重复的数据在表A里面移除掉,并且根据Index在B表里面指定行的错误信息的列填上备注表示该行是重复的。

ps:下面是我的代码

 for (int i = dt.Rows.Count - 1; i > -1; i--)
        {
            bool bo = false;
            DataRow row;
            try
            {
                row = dt.Rows[i];
            }
            catch (Exception)
            {
                continue;
            }
            for (int j = i - 1; j > -1; j--)
            {
                DataRow row2 = dt.Rows[j];
                if (row[0].ToString() == row2[0].ToString())//若该字段相同,则存在重复,将重复行号,手机号码加入dupList
                {
                    bo = true;
                    failureCount++;
                    errdt.Select("Index='" + row2["Index"].ToString() + "'")[0]["错误信息"] = "重复(手机号码为" + row2["手机号码"].ToString() + "的所有短信不会发送!)";
                    dt.Rows.Remove(row2);
                }
            }
            if (bo)//存在重复的记录
            {
                errdt.Select("Index='" + row["Index"].ToString() + "'")[0]["错误信息"] = "重复(手机号码为" + row["手机号码"].ToString() + "的所有短信不会发送!)";
                failureCount++;
                dt.Rows.Remove(row);
            }
            dt.AcceptChanges();
        }
  
ps:其中dt是我上面说明的表A,errdt是表B。我这个代码是一行行的去循环,太慢了。请教各位大神,有没有快速的方法。  我在网上找了,去除重复的,都是保留一条数据,因为我这个业务要求是只要是有手机号码重复的数据都得去掉,因为不知道哪条数据才是正确需要发送的。 数据 table重复 c#
[解决办法]

/// <summary>
        /// 验证费用名称是否相同
        /// </summary>


        /// <param name="dgv">需要验证的dgv</param>
        /// <returns>true为不同,false为相同</returns>
        private static bool CheckCostNameIsLike(GHDataGridView dgv)
        {
            bool flag = true;
            if (dgv.Rows.Count > 0)
            {
                DataTable dtCostName = (dgv.DataSource as DataTable).Copy();

                DataView dv = new DataView(dtCostName);
                if (dv.Count != dv.ToTable(true, "CostName").Rows.Count)
                    flag = false;
            }

            return flag;
        }


[解决办法]
把数据抽像一下,抽像成一个类。每一条数据为一个对象。

然后A放到哈希表中,手机号作为key.

拿B表中的数据项的手机号去查找哈希表,由此判断。

你已经发过一次帖了。好好想一下,做一下,会收获很多。数据结构不是白学的,你的代码时间复杂度是m*n,用哈希表,只要m+n.
[解决办法]
循环里面用errdt.Select("Index='" + row2["Index"].ToString() + "'")[0]["错误信息"] = "重复(手机号码为" + row2["手机号码"].ToString() + "的所有短信不会发送!)";比较慢
可以考虑将Index设置为primary key
可以将手机号放到HashSet中,自动去重复,通过添加成功来判定没有重复,然后dt.Rows.RemoveAt(j)
[解决办法]
A: 手机号码               发送内容    Index    错误信息    
      13800000001         200       1
     13800000002         200       2
     13800000002         15        3
     13800000003         220       4
         .                .
         .                .
     13800019999         550      19999

select 
    手机号码, 
    sum(发送内容) as 发送内容,
    STUFF((
          SELECT ',' + Index
          FROM 表 t
          WHERE 手机号码 = t.手机号码
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') as 备注
from table
group by 手机号码

热点排行