c# datatable按主键合并相同主键返回新的datatable

时间:2022-02-01 16:23:59

一、概述:

       在python转c#时,python中pandas.merge可以按主键合并两个datatable,苦苦找了很久,希望c#也有同样的函数,未果,就自己写了一个,目前测试没问题,同样我也考虑了效率和简洁的问题。

二、原理:

     (1)封装的函数如下:传入两个datatable和主键,返回一个datatable

                 private DataTable unite_on_datatable(DataTable dt1,DataTable dt2,string key)

      (2)先将dt1和dt2按照主键排序,声明一个新的datatable叫dt3,dt3包含了所有的列名,然后dt1和dt2从上到下遍历一遍,将所有相同的主键的列全部加到dt3中

三、展示结果:

     c# datatable按主键合并相同主键返回新的datatable

 

四、代码:

 

 1  private DataTable unite_on_datatable(DataTable dt1,DataTable dt2,string key)
 2         {
 3             DataTable dt3 = dt1.Clone();
 4             for(int i=0;i<dt2.Columns.Count;i++)
 5             {
 6                 if(dt2.Columns[i].ColumnName!=key)
 7                 {
 8                     dt3.Columns.Add(dt2.Columns[i].ColumnName);
 9                 }
10             }
11 
12             //先排序
13             dt1 = sort_desc(dt1, key);
14             dt2 = sort_desc(dt2, key);
15 
16             int count1 = 0,count2=0;
17             while(true)
18             {
19                 if (count1 >= (dt1.Rows.Count) || (count2 >= (dt2.Rows.Count)))
20                     return dt3;
21                 
22                 //找到
23                 while(string.Compare(dt1.Rows[count1][key].ToString(),dt2.Rows[count2][key].ToString())<0)
24                 {
25                     count1++;
26                     if (count1 >= dt1.Rows.Count)
27                         return dt3;
28                 }
29                 while (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) < 0)
30                 {
31                     count2++;
32                     if (count2 >= dt2.Rows.Count)
33                         return dt3;
34                 }
35 
36                 if (dt1.Rows[count1][key]==dt2.Rows[count2][key])
37                 {
38                     //赋值给新的一列
39                     DataRow dr = dt3.NewRow();
40                     for(int i=0;i<dt1.Columns.Count;i++)
41                     {
42                         dr[dt1.Columns[i].ColumnName] = dt1.Rows[count1][dt1.Columns[i].ColumnName];
43                     }
44                     for(int i=0;i<dt2.Columns.Count;i++)
45                     {
46                         dr[dt2.Columns[i].ColumnName] = dt2.Rows[count2][dt2.Columns[i].ColumnName];
47                     }
48                     dt3.Rows.Add(dr.ItemArray);
49                     count1++;
50                     count2++;
51                 }
52             }
53 
54             return dt3;
55         }
56 
57 
58         //对DataTable排序
59         private DataTable sort_desc(DataTable dt1,string key)
60         {
61             DataTable dt2 = dt1.Clone();
62             DataRow[] dr= dt1.Select("", key + " desc");
63             for (int i = 0; i < dr.Length; i++)
64             {
65                 dt2.Rows.Add(dr[i].ItemArray);
66             }
67             return dt2;
68         }

 五、准备写好更多datatable合并类似于pandas.merge的例子,封装成一个dll文件。整体的文件见:https://github.com/cysisu/datatable-,后续会继续更新