合并两个数据表

本文关键字:两个 数据表 合并 | 更新日期: 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);
}