合并2个数据表

问题描述:

我有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 

我怎样才能得到呢?

这是一个问题,遵循一个简单的条件逻辑,您需要在foreach语句中处理每个元素。

你想要处理这个,所以每当一行中的元素都为空时。 你去数据表2中的那一行,并检查它是否有值,如果是这样,这将成为 数据表1中的新值。 如果这不会引发错误。 我已经提供了这个link how to compare,但实际上你并不需要这样做,因为你所做的只是在一个字段中测试null。

使用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框架版本是你的? –