c# datatable按主键合并相同主键返回新的datatable
标签:包含 pre unit turn desc width http count python
一、概述:
在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中
三、展示结果:
四、代码:
1 private DataTable unite_on_datatable(DataTable dt1,DataTable dt2,string key)
2 {
3 DataTable dt3 = dt1.Clone();
4 for(int i=0;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)
41 {
42 dr[dt1.Columns[i].ColumnName] = dt1.Rows[count1][dt1.Columns[i].ColumnName];
43 }
44 for(int i=0;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 )
64 {
65 dt2.Rows.Add(dr[i].ItemArray);
66 }
67 return dt2;
68 }
五、准备写好更多datatable合并类似于pandas.merge的例子,封装成一个dll文件。整体的文件见:https://github.com/cysisu/datatable-,后续会继续更新
c# datatable按主键合并相同主键返回新的datatable
标签:包含 pre unit turn desc width http count python
原文地址:https://www.cnblogs.com/cysisu/p/10753195.html
评论