读书人

过滤datatable,该如何解决

发布时间: 2013-10-12 11:54:02 作者: rapoo

过滤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());

读书人网 >C#

热点推荐