日期:2014-05-17  浏览次数:20829 次

过滤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表里面多余的数据处理掉。。
数据 性能 C#

------解决方案--------------------
本帖最后由 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());