一、概述:
在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<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-,后续会继续更新