虽然DataTable.Merge可以很好的实现,但以下代码写出来更好理解

  1. DataTable DataTable1 = new DataTable();
  2. DataTable DataTable2 = new DataTable();
  3. DataTable newDataTable = DataTable1.Clone();
  4.  
  5. object[] obj = new object[newDataTable.Columns.Count];
  6. for (int i = ; i < DataTable1.Rows.Count; i++)
  7. {
  8. DataTable1.Rows[i].ItemArray.CopyTo(obj,);
  9. newDataTable.Rows.Add(obj);
  10. }
  11. for (int i = ; i < DataTable2.Rows.Count; i++)
  12. {
  13. DataTable2.Rows[i].ItemArray.CopyTo(obj,);
  14. newDataTable.Rows.Add(obj);
  15. }
  16. //或者
  17. DataTable DataTable1 = new DataTable();
  18. DataTable DataTable2 = new DataTable();
  19.  
  20. object[] obj = new object[DataTable1 .Columns.Count];
  21. for (int i = ; i < DataTable2.Rows.Count; i++)
  22. {
  23. DataTable2.Rows[i].ItemArray.CopyTo(obj,);
  24. DataTable1.Rows.Add(obj);
  25. }

两个结构不同的DataTable合并

  1. /// <summary>
  2. /// 将两个列不同的DataTable合并成一个新的DataTable
  3. /// </summary>
  4. /// <param name="dt1">Table表1</param>
  5. /// <param name="dt2">Table表2</param>
  6. /// <param name="DTName">合并后新的表名</param>
  7. /// <returns></returns>
  8.  
  9. private DataTable UniteDataTable( DataTable dt1 ,DataTable dt2 ,string DTName)
  10. {
  11. DataTable dt3 = dt1.Clone();
  12. for( int i = ;i < dt2.Columns.Count ;i ++ )
  13. {
  14. dt3.Columns.Add( dt2.Columns[i].ColumnName ) ;
  15. }
  16. object[] obj = new object[dt3.Columns.Count];
  17.  
  18. for (int i = ; i < dt1.Rows.Count; i++)
  19. {
  20. dt1.Rows[i].ItemArray.CopyTo(obj,);
  21. dt3.Rows.Add(obj);
  22. }
  23.  
  24. if( dt1.Rows.Count >= dt2.Rows.Count )
  25. {
  26. for( int i = ;i < dt2.Rows.Count ;i++ )
  27. {
  28. for( int j = ;j < dt2.Columns.Count ;j ++ )
  29. {
  30. dt3.Rows[i][j+dt1.Columns.Count] = dt2.Rows[i][j].ToString() ;
  31. }
  32. }
  33. }
  34. else
  35. {
  36. DataRow dr3 ;
  37. for( int i = ;i < dt2.Rows.Count - dt1.Rows.Count ;i ++ )
  38. {
  39. dr3 = dt3.NewRow() ;
  40. dt3.Rows.Add( dr3 ) ;
  41. }
  42. for( int i = ;i < dt2.Rows.Count ;i++ )
  43. {
  44. for( int j = ;j < dt2.Columns.Count ;j ++ )
  45. {
  46. dt3.Rows[i][j+dt1.Columns.Count] = dt2.Rows[i][j].ToString() ;
  47. }
  48. }
  49. }
  50. dt3.TableName = DTName ;
  51. return dt3 ;
  52. }

今天一位朋友问如何去掉DataTable里重复的记录(DataTable是别人返回过来的,不能再重新查询数据库,所以无法用sql中的select distinct xxx处理,只能在DataTable上动脑筋)

思路:将DataTable转成IEnumerable,然后就能调用Distinct方法了

  1. System.Collections.Generic;
  2. using System.Linq;
  3. using System.Data;
  4. using System;
  5.  
  6. namespace ConsoleApplication2
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. DataTable tbl = new DataTable();
  13. tbl.Columns.Add("Id", typeof(System.Int32));
  14. tbl.Columns.Add("City", typeof(System.String));
  15. tbl.Columns.Add("Province", typeof(System.String));
  16.  
  17. tbl.Rows.Add(, "武汉", "湖北");
  18. tbl.Rows.Add(, "应城", "湖北");
  19. tbl.Rows.Add(, "武汉", "湖北");
  20.  
  21. IEnumerable <DataRow> r = tbl.AsEnumerable().Distinct(new CityComparer());
  22.  
  23. //到这一步,r里就是去重复的记录了
  24.  
  25. foreach (var item in r)
  26. {
  27. Console.WriteLine(item["Id"] + "," + item["City"] + "," + item["Province"]);
  28. }
  29.  
  30. Console.ReadLine();
  31. }
  32.  
  33. }
  34.  
  35. class CityComparer : IEqualityComparer <DataRow>
  36. {
  37. public bool Equals(DataRow r1, DataRow r2)
  38. {
  39. return r1["City"] == r2["City"];
  40. }
  41.  
  42. public int GetHashCode(DataRow obj)
  43. {
  44. return obj.ToString().GetHashCode();
  45. }
  46.  
  47. }
  48. }

上面的代码,将DataTable中"城市名"重复的记录去掉了,以上代码同样适用于List<T>(只要改下"比较器"即可)

ASP.Net【如何合并DataTable,并且去重复方法】的更多相关文章

  1. DataTable去重复方法

    //去掉重复行 DataTable table=new DataTable(); DataView dv = table.DefaultView; table = dv.ToTable(true, n ...

  2. 漫谈数组去重复方法(亮点是ES6的新API)

    方法1: 利用遍历的思想来进行. <!DOCTYPE html><html lang="en"><head> <meta charset= ...

  3. DataTable distinct 去重复

    有时我们需要从DataTable中抽取Distinct数据,以前总是以对DataTable进行foreach之类纯手工方式获取. 近来发现DataView可以帮我们直接获取Distinct数据,汗一个 ...

  4. 利用Linq对集合元素合并、去重复处理

    本文转载:http://www.cnblogs.com/yjmyzz/archive/2012/12/18/2823170.html 今天写代码时,需要对一个数组对象中按一定规则合并.去重处理,不想再 ...

  5. 批处理快速合并多分Excel文件并将指定列的数据去重复

    1.批处理快速合并多个excel文件方法: 新建一个.txt文本文件,就命名为合并.txt吧. 而后开启文件,复制以下代码到文件中: @echo off E: cd xls dir copy *.cs ...

  6. 为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式

    为了去重复,写了一个通用的比较容器类,可以用在需要比较的地方,且支持Lamda表达式,代码如下: public class DataComparer<T>:IEqualityCompare ...

  7. ASP.NET MVC 使用dataTable(3)--更多选项参考

    ASP.NET MVC 使用dataTable(3)--更多选项参考 jQuery  dataTables 插件是一个优秀的表格插件,是后台工程师的福音!它提供了针对数据表格的排序.浏览器分页.服务器 ...

  8. R合并数据框有重复匹配时只保留第一行

    前言 合并数据框有重复匹配时通常会返回所有的匹配,如何只保留匹配的第一行呢?其实这个需求也很常见.如芯片探针ID和基因ID往往多对一,要合并ID对应矩阵和芯片表达矩阵时. 数据例子 data = da ...

  9. mysql数据库去重复

    参考:http://www.cnblogs.com/duanjie/archive/2011/08/13/2136862.html 说到去重复,感觉逻辑很简单.但动手写起来却并不是那么容易.面试的时候 ...

随机推荐

  1. iOS 10 的一些变化

    原文链接:http://www.jianshu.com/p/9756992a35ca

  2. HTML5 HybridApp开发上手指引

    眼下我们项目是基于AngularJS和ionic框架开发的Hybrid App.支持android phone/pad, iPhone,iPad四个平台版本号.以及微信版. 由于使用的技术有点新,所以 ...

  3. MySql5.1在Win7下的安装与重装问题的解决

    痛苦啊痛苦,我也不知道这两天怎么了.上班没有精神,还打瞌睡,下班后又感觉很累.精力集中不起来. 这篇花了我好久的时间,我效率这么差,~\(≧▽≦)/~. 软件包下载 首先单击mysql-5.1.53- ...

  4. VS2010 配置 DirectX 开发环境

    1.首先下载 DXSDK 并安装 http://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/D ...

  5. CDZSC_2015寒假新人(1)——基础 f

    Description An inch worm is at the bottom of a well n inches deep. It has enough energy to climb u i ...

  6. 七牛云Fetch第三方资源并转码(PHP版)

    七牛云的图片加速一直在用,好用没得说,最近项目需要做个微信端录音,然后上传,别人试听的功能,录音和上传用的都是微信的接口,有文档,比较方便,但是上传后,微信只给保存3天,所以就下载到了七牛,也就用到了 ...

  7. MySQL命令记录1

    mysql命令行 开启:net start mysql56关闭:net start mysql56(这两种情况必须有管理员权限) 登陆:mysql -h localhost -u root -p(lo ...

  8. Android小代码——设置全屏

    1: public class MainActivity extends Activity { 2: @Override 3: public void onCreate(Bundle savedIns ...

  9. Vector, ArrayList, Array

    JAVA新手在使用JAVA的时候大概都会遇到这个问题: JAVA中的Array, ArrayList, Vector, List, LinkedList有什么样的区别?尤其是Vector, Array ...

  10. Oracle EBS-SQL (OM-5):检查订单事务处理类型.sql

    SELECT            HO.NAME OU                                                                         ...