2011-11-25 82 views
0

我有2個數據表與這些領域:合併2個數據表

DataTable1

Hour - Value1 
0 - 34 
1 - 22 
2 - NULL 
3 - 12 
.. 
.. 
23 - 10 

DataTable2

Hour - Value1 
0 - NULL 
1 - 22 
2 - 35 
3 - 11 
.. 
.. 
23 - NULL 

我需要填充具有相同的 「一小時」 領域的獨特的DataTable(一天中的小時),並且如果值不爲null,則值必須從DataTable1中獲取值。如果Datatable1中的值爲空,則必須從DataTable2中獲取對應的值。 如果來自DataTable2的值爲空,則必須記錄該錯誤。

對於我的例子,我需要得到:

DataTableResult

Hour - Value1 
0 - 34 
1 - 22 
2 - 35 
3 - 12 
.. 
.. 
23 - 10 

我怎樣才能得到呢?

回答

1

這是一個問題,遵循一個簡單的條件邏輯,您需要在foreach語句中處理每個元素。

你想要處理這個,所以每當一行中的元素都爲空時。 你去數據表2中的那一行,並檢查它是否有值,如果是這樣,這將成爲 數據表1中的新值。 如果這不會引發錯誤。 我已經提供了這個link how to compare,但實際上你並不需要這樣做,因爲你所做的只是在一個字段中測試null。

1

使用LINQ to對象,並假設dataTable1和dataTable2具有相同的列:

var hoursMap1 = dataTable1.Rows.Cast<DataRow>().ToDictionary(row => row[0]); 
var hoursMap2 = dataTable2.Rows.Cast<DataRow>().ToDictionary(row => row[0]); 

var resultTable = new DataTable(); 

// Clone the column from table 1 
for (int i = 0; i < dataTable1.Columns.Count; i++) 
{ 
    var column = dataTable1.Columns[i]; 
    resultTable.Columns.Add(column.ColumnName, column.ColumnType); 
} 

foreach (var entry in hoursMap1) 
{ 
    int hours = entry.Key; 
    DataRow row1 = entry.Value; 
    DataRow row2 = null; 
    if (!hoursMap2.TryGetValue(hours, out row2)) 
    { 
    // Hours in table 1 but not table 2, handle error 
    } 

    var fields = new object[resultTable.Columns.Count]; 
    int fieldIndex = 0; 
    fields[fieldIndex++] = hours; 

    for (int i = 1; i < row1.ItemsArray.Length; i++) 
    { 
    var field1 = row1.ItemsArray[i]; 
    var field2 = row2.ItemsArray[i]; 
    var newField = field1 ?? field2; 
    if (newField == null) 
    { 
     // Field neither in table 1 or table 2, handle error 
    } 

    fields[fieldIndex++] = newField; 
    } 

    resultTable.Rows.Add(fields); 
} 
+0

太謝謝你了。我會嘗試第二個例子。 Luigi – Ciupaz

+0

@Ciupaz第二個例子,我只寫了一個??順便說一句,哪個.net框架版本是你的? –