合并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);
}
太谢谢你了。我会尝试第二个例子。 Luigi – Ciupaz
@Ciupaz第二个例子,我只写了一个??顺便说一句,哪个.net框架版本是你的? –