过滤datatable
有2个table
A: 手机号码 姓名 序号
13800000000 张三 1
13800000002 王五 3
B:手机号码 姓名 序号
13800000000 张三 1
13800000001 李四 2
13800000002 王五 3
结果
B1:手机号码 姓名 序号
13800000001 李四 2
我要的结果是把B表变成B1表。也就是要把B表里面的数据如果发现在A表里面存在就要移除掉。只剩下A表里面没有的数据。
表的行数都比较多。最少有2W左右。(A表的数据比B表的数据少)如果一条条去循环A表,然后在拿序号去B表里面找。找到了就删掉找不到就不管的话这样性能很慢的。有没有直接快捷的方法可以把B表里面多余的数据处理掉。。
------解决方案--------------------本帖最后由 bdmh 于 2013-10-08 16:30:53 编辑
你用sql直接 inner join多好,或者用linq取交集
参考http://www.cnblogs.com/Mayvar/archive/2011/07/04/wanghonghua_201107040534.html
------解决方案--------------------sorry,漏了个!
.Where(b =>
!dtA.AsEnumerable().Select(a => a.Field<int>("手机号码")).Contains(b.Field<int>("手机号码")))
------解决方案--------------------把A表中的数据放到哈希表里,手机号作为key,value设为true或什么其他标志,表明已存在。
遍历B表,以手机号作为key,来查看该手机号是否已经存在(ContainsKey方法,时间复杂度O(1))来过虑。
所以时间复杂度为O(m+n).
如果是多核CPU,可以用多线程分段来处理提高过虑速度。
------解决方案--------------------Index 列是什么类型的? 不是int吧?
------解决方案--------------------DEBUG,看看errdt和dt是否有值
------解决方案--------------------用Except求差集。
public class DRComp : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y)
{
return x["主键"].ToString().Equals(y["主键"].ToString());
}
public int GetHashCode(DataRow obj)
{
return obj["主键"].GetHashCode();
}
}
DataTable a,b;
//....
b.AsEnumerable().Except(a.AsEnumerable(), new DRComp());