删除内存中DataTable表的重复行
假设在内存中(不是数据库中)有两个表:
表一:TableA
Name | Phone |
张三 | 123456 |
李四 | 123457 |
王五 | 1234568 |
表二:TableB
Name | Phone |
张三 | 123456 |
李四2 | 123465 |
王五2 | 123466 |
现在要求把这两个表按照手机号去重后合并。
方法一:
观察后发现,这两个表有重复项:TableA中的“张三”和TableB中的“张三”。
我们可以用算法在程序中遍历两个表去重,对比之后再放入新的表中,返回新表,这个方法可行,不过数据量大的时候性能就会特别差,耗时很高。
方法二:
我们可以用.net提供的Linq查询做,很方便。参考:http://blog.csdn.net/q107770540/article/details/6252339
方法三:
我们可以用“筛选视图”做,比较方便。
首先,建一个TableC,把字段“Phone”设为主键,把第一个表的架构和数据复制到新建的TableC中,然后把第二个表合并到TableC中,最后用DefaultView.ToTable方法去重,返回TableC即可。源码如下:
/// <summary>
/// 合并数据
/// </summary>
/// <param name="TableA">表一</param>
/// <param name="TableB">表二</param>
/// <returns></returns>
public DataTable MergeData(DataTable TableA, DataTable TableB)
{
DataTable TableC = new DataTable();
TableC = TableA.Copy();//复制架构和数据
TableC.PrimaryKey = new DataColumn[1] { TableC.Columns["Phone"] };//设置主键
TableC.Merge(TableB);//合并B表
TableA.Dispose();
TableB.Dispose();
//要保留的字段
string[] Colomns = new string[] { " Name ","Phone"};
//已去重的表
TableC = TableC.DefaultView.ToTable(true, Colomns);
return TableC;
}