一、概述:
在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中
三、展示結果:
四、代碼:
//對兩個datatable進行排序 private DataTable unite_on_datatable(DataTable dt1, DataTable dt2, string key) { DataTable dt3 = dt1.Clone(); for (int i = 0; i < dt2.Columns.Count; i++) { if (dt2.Columns[i].ColumnName.ToLower() != key.ToLower()) { dt3.Columns.Add(dt2.Columns[i].ColumnName); } } //先排序 dt1 = sort_desc(dt1, key); dt2 = sort_desc(dt2, key); int count1 = 0, count2 = 0; while (true) { string heatid1 = dt1.Rows[count1][key].ToString(); string heatid2= dt2.Rows[count2][key].ToString(); if (count1 >= (dt1.Rows.Count) || (count2 >= (dt2.Rows.Count))) return dt3; if (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) > 0) { //找到 while (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) > 0) { string heat_id1 = dt1.Rows[count1][key].ToString(); string heat_id2 = dt2.Rows[count2][key].ToString(); count1++; if (count1 >= dt1.Rows.Count) return dt3; } while (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) < 0) { count2++; if (count2 >= dt2.Rows.Count) return dt3; } } else if(string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) < 0) { while (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) < 0) { count2++; if (count2 >= dt2.Rows.Count) return dt3; } //找到 while (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) > 0) { count1++; if (count1 >= dt1.Rows.Count) return dt3; } } if (string.Compare(dt1.Rows[count1][key].ToString(), dt2.Rows[count2][key].ToString()) == 0) { //賦值給新的一列 DataRow dr = dt3.NewRow(); for (int i = 0; i < dt1.Columns.Count; i++) { dr[dt1.Columns[i].ColumnName] = dt1.Rows[count1][dt1.Columns[i].ColumnName]; } for (int i = 0; i < dt2.Columns.Count; i++) { dr[dt2.Columns[i].ColumnName] = dt2.Rows[count2][dt2.Columns[i].ColumnName]; } dt3.Rows.Add(dr.ItemArray); count1++; count2++; } } } //對DataTable排序 private DataTable sort_desc(DataTable dt1, string key) { DataTable dt2 = dt1.Clone(); DataRow[] dr = dt1.Select("", key + " desc"); for (int i = 0; i < dr.Length; i++) { dt2.Rows.Add(dr[i].ItemArray); } return dt2; }
五、總結
准備寫好更多datatable合並類似於pandas.merge的例子,封裝成一個dll文件。整體的文件見:https://github.com/cysisu/datatable-,后續會繼續更新