合并两个数据表
本文关键字:两个 数据表 合并 | 更新日期: 2023-09-27 18:15:36
我有两个数据表,这些字段:
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
我需要填充一个唯一的数据表,它具有相同的"小时"字段(一天中的小时),并且值必须从DataTable1中获取值,如果不是null。如果Datatable1中的值为null,则必须从DataTable2中获取相应的值。如果DataTable2的值也为null,则必须记录错误。
对于我的例子,我需要得到:DataTableResult
Hour - Value1
0 - 34
1 - 22
2 - 35
3 - 12
..
..
23 - 10
我怎样才能得到这个?
这个问题遵循一个简单的条件逻辑,您需要处理foreach语句中的每个元素。
您想要处理这个,以便每次在行中的元素为null时。你去datatable 2中的那一行检查它是否有一个值数据表1所示。如果没有,则抛出错误。我已经提供了这个链接如何比较,但实际上你不需要这个,因为你所做的只是在一行中的字段中测试null
对对象使用Linq并假设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);
}