比較 string Array
http://www.dotblogs.com.tw/rainmaker/archive/2012/02/02/67456.aspx
比較兩個 DataTable
/// <summary> /// 比較兩個DataTable數據(結構相同) /// </summary> /// <param name="dt1">來自數據庫的DataTable</param> /// <param name="dt2">來自文件的DataTable</param> /// <param name="keyField">關鍵字段名</param> /// <param name="dtRetAdd">新增數據(dt2中的數據)</param> /// <param name="dtRetDif1">不同的數據(數據庫中的數據)</param> /// <param name="dtRetDif2">不同的數據(圖2中的數據)</param> /// <param name="dtRetDel">刪除的數據(dt2中的數據)</param> public static void CompareDt(DataTable dt1, DataTable dt2, string keyField, out DataTable dtRetAdd, out DataTable dtRetDif1, out DataTable dtRetDif2, out DataTable dtRetDel) { //為三個表拷貝表結構 dtRetDel = dt1.Clone(); dtRetAdd = dtRetDel.Clone(); dtRetDif1 = dtRetDel.Clone(); dtRetDif2 = dtRetDel.Clone(); int colCount = dt1.Columns.Count; DataView dv1 = dt1.DefaultView; DataView dv2 = dt2.DefaultView; //先以第一個表為參照,看第二個表是修改了還是刪除了 foreach (DataRowView dr1 in dv1) { dv2.RowFilter = keyField + " = '" + dr1[keyField].ToString() + "'"; if (dv2.Count > 0) { if (!CompareUpdate(dr1, dv2[0]))//比較是否有不同的 { dtRetDif1.Rows.Add(dr1.Row.ItemArray);//修改前 dtRetDif2.Rows.Add(dv2[0].Row.ItemArray);//修改後 dtRetDif2.Rows[dtRetDif2.Rows.Count - 1]["FID"] = dr1.Row["FID"];//將ID賦給來自文件的表,因為它的ID全部==0 continue; } } else { //已經被刪除的 dtRetDel.Rows.Add(dr1.Row.ItemArray); } } //以第一個表為參照,看記錄是否是新增的 dv2.RowFilter = "";//清空條件 foreach (DataRowView dr2 in dv2) { dv1.RowFilter = keyField + " = '" + dr2[keyField].ToString() + "'"; if (dv1.Count == 0) { //新增的 dtRetAdd.Rows.Add(dr2.Row.ItemArray); } } } //比較是否有不同的 private static bool CompareUpdate(DataRowView dr1, DataRowView dr2) { //行裡只要有一項不一樣,整個行就不一樣,無需比較其它 object val1; object val2; for (int i = 1; i < dr1.Row.ItemArray.Length; i++) { val1 = dr1[i]; val2 = dr2[i]; if (!val1.Equals(val2)) { return false; } } return true; }