2012-11-28 33 views
0

我有一個關於比較2個表格的問題。如果在表1中不包含表2中列的名稱,則添加具有值的列。所以我用我的代碼做了它,但不知道爲什麼它給我錯誤,列已經屬於tables1。我在這裏做錯了什麼?有沒有更好的方法來做到這一點?比較2個表格列名稱,添加它如果不存在

實施例,表1:

Name LastName 
a  aa 
b  bb 

表2:

Name Product 
s  dd 
a  ss 

結果:

Name LastName Product 
a  aa   dd 
b  bb   ss  

我的代碼:

for (int i = 0; i < excelTb2.Columns.Count; i++) 
       { 
        for (int j = 0; j < Temp.Columns.Count; j++) 
        { 
         if (Temp.Columns[j].ColumnName.ToString() != excelTb2.Columns[i].ColumnName.ToString()) 
         { 
          excelTb2.Columns.Add(Temp.Columns[j].ColumnName.ToString()); 

          for (int ok = 0; ok < 2; ok++) 
          { 
           excelTb2.Rows[ok][Temp.Columns[j].ColumnName] = Temp.Rows[ok][j]; 
          } 

         } 
        } 
       } 
+0

@Blachshma誤差的主要原因的需求:我只是想比較列的名稱,而不是單元格,這就是爲什麼我忽略下行是 –

回答

0

列是一個集合。你可以檢查列名已經存在使用包含

for (int j = 0; j < Temp.Columns.Count; j++) 
{ 
    if(!excelTb2.Columns.Contains(Temp.Columns[j].ColumnName)) 
    { 
     excelTb2.Columns.Add(Temp.Columns[j].ColumnName.ToString()); 
     ... 
    } 
} 

這將刪除嵌套的循環,就是你得到

+0

謝謝,它的作用像一個魅力。這是我正在尋找的 –

+0

@LeVietHung:添加了一個完整的方法,以防你卡在其他地方。 –

0

您可以使用此Merge方法,合併兩個DataTables架構,並加入數據的行索引(如果兩個表包含一列,按要求表1的數據將採取):

public static DataTable MergeOnRowIndex(DataTable table1, DataTable table2) 
{ 
    var data = table1.AsEnumerable() 
     .Select((r, i) => new 
     { 
      Row1 = r, 
      Row2 = i >= table2.Rows.Count ? null : table2.Rows[i] 
     }); 
    DataTable table3 = new DataTable(); 
    foreach (DataColumn col in table1.Columns) 
    { 
     table3.Columns.Add(col.ColumnName, col.DataType); 
    } 
    foreach(DataColumn col in table2.Columns) 
     if(!table3.Columns.Contains(col.ColumnName)) 
      table3.Columns.Add(col.ColumnName, col.DataType); 

    if(data.Any()) 
    { 
     foreach(var x in data) 
     { 
      var newRow = table3.Rows.Add(); 
      for (int i = 0; i < table1.Columns.Count; i++) 
      { 
       newRow[i] = x.Row1.ItemArray[i]; 
      } 
      if (x.Row2 != null) 
      { 
       for (int i = table1.Columns.Count; i < table3.Columns.Count; i++) 
       { 
        DataColumn currentColumn = table3.Columns[i]; 
        newRow[currentColumn.ColumnName] = x.Row2[currentColumn.ColumnName]; 
       } 
      } 
     } 
    } 
    return table3; 
} 

在這裏,我已使用該方法在您的樣品數據上獲得所需結果:

var table = new DataTable(); 
table.Columns.Add("Name"); 
table.Columns.Add("LastName"); 
var otherTable = new DataTable(); 
otherTable.Columns.Add("Name"); 
otherTable.Columns.Add("Product"); 
table.Rows.Add("a","aa"); 
table.Rows.Add("b","bb"); 
otherTable.Rows.Add("s","dd"); 
otherTable.Rows.Add("a","ss"); 

DataTable result = MergeOnRowIndex(table, otherTable); 
+0

謝謝,完美的作品。 –

+0

@LeVietHung:請注意,如果表格很大('Row2 = i> = table2.Rows.Count?null:table2.Rows [i]'),我編輯的代碼更有效率。 –

+0

非常感謝Tim,我將你的代碼添加到我的程序中,像從未做過的那樣工作 –

相關問題