主頁 » 閒聊 » [C#] Compare two string Arrays

[C#] Compare two string Arrays

比較 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;
}

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s