2011-05-31 4 views
0

ce qui serait la meilleure façon de comparer deux tableau de données. i remplir deux tables de lecture de données deux différents xml et maintenant je dois comparer et retourner la différence en termes de datatable.my comparer la logique étaitcomparer deux datatable dans C#

private DataTable CompareDataTables(DataTable dtFirst, DataTable dtSecond) 
    { 
     int result = 0; 
     bool flag = false; 
     DataTable dtNoRows = new DataTable(); 
     dtNoRows.Columns.Add("Result"); 

     DataTable dtDiff = new DataTable(); 
     dtDiff.Columns.Add("Field Name"); 
     dtDiff.Columns.Add("Old Value"); 
     dtDiff.Columns.Add("New Value"); 
     DataRow dr = null; 
     if (dtFirst.Columns.Count == dtSecond.Columns.Count) 
     { 
      for (int i = 0; i <= dtFirst.Columns.Count - 1; i++) 
      { 
       try 
       { 
        DateTime.Parse(dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString().Trim()); 
        flag = true; 
       } 
       catch (Exception ex) 
       { 
        flag = false; 
       } 

       if (!flag) 
       { 
        if (dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString().Trim().ToUpper() != dtSecond.Rows[0][dtSecond.Columns[i].ColumnName.ToString()].ToString().Trim().ToUpper()) 
        { 
         dr = dtDiff.NewRow(); 
         dr["Field Name"] = dtFirst.Columns[i].ColumnName.ToString(); 
         dr["Old Value"] = dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString().Trim(); 
         dr["New Value"] = dtSecond.Rows[0][dtSecond.Columns[i].ColumnName.ToString()].ToString().Trim(); 
         dtDiff.Rows.Add(dr); 
        } 
       } 
       else 
       { 
        result = DateTime.Compare(DateTime.Parse(dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString()), DateTime.Parse(dtSecond.Rows[0][dtSecond.Columns[i].ColumnName.ToString()].ToString())); 
        if (result != 0) 
        { 
         dr = dtDiff.NewRow(); 
         dr["Field Name"] = dtFirst.Columns[i].ColumnName.ToString(); 
         dr["Old Value"] = DateTime.Parse(dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString().Trim()).ToString("MM/dd/yyyy") + " - " + DateTime.Parse(dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString().Trim()).ToString("hh:mm:ss"); 
         dr["New Value"] = DateTime.Parse(dtSecond.Rows[0][dtSecond.Columns[i].ColumnName.ToString()].ToString().Trim()).ToString("MM/dd/yyyy") + " - " + DateTime.Parse(dtSecond.Rows[0][dtSecond.Columns[i].ColumnName.ToString()].ToString().Trim()).ToString("hh:mm:ss"); 
         dtDiff.Rows.Add(dr); 

        } 
        flag = false; 
       } 
      } 
     } 
     return dtDiff; 
    } 

mon code fonctionne bien mais je dois l'est-il meilleure façon en dehors. Guidez-moi s'il-vous-plaît.

+5

vous attendez-vous des différences structurelles ou les différences de valeur? – IndigoDelta

+0

Vous pouvez ajouter deux dictionnaires avec une clé pour récupérer et comparer BEAUCOUP plus rapidement. – CodingBarfield

+0

Juste une note ... n'est-il pas préférable d'utiliser * dtFirst.Rows [0] [i] .ToString() * à la place * dtFirst.Rows [0] [dtFirst.Columns [i] .ColumnName.ToString()]. ToString() *? – Reniuz

Répondre

0

vous pouvez utiliser LINQ pour comparer les valeurs des tables (deux tables doivent avoir la même structure)

bool flag = false; 
if (dtFirst.Columns.Count == dtSecond.Columns.Count) 
{ 
    for (int i = 0; i <= dtFirst.Columns.Count - 1; i++) 
    { 
     String colName = dtFirst.Columns[i].ColumnName; 
     var colDataType = dtFirst.Columns[i].DataType.GetType(); 
     var colValue = dtFirst.Columns[i]; 
     flag = dtSecond.AsEnumerable().Any(T => typeof(T).GetProperty(colName).GetValue(T, typeof(colDataType)) == colValue); 
    } 
} 
0
var qry1 = dtDuplicate.AsEnumerable().Select(a => new { SchoolID = a["SchoolMID"].ToString()}); 
var qry2 = dsValadateSchoolInfo.Tables[1].AsEnumerable().Select(b => new { SchoolID = ["SchoolMID"].ToString() }); 

var exceptAB = qry1.Except(qry2); 

DataTable dtMisMatch = (from a in dtDuplicate.AsEnumerable() 
         join ab in exceptAB on a["SchoolMID"].ToString() equals ab.SchoolID 
         select a).CopyToDataTable(); 
+0

veuillez expliquer votre réponse – johannes