我有两个数据表。第一表的列是
a b c d e
第二个表的列是
b c f d e g
我想从第二个表中存在的第一个表中复制所有列的数据。
我的表格很大,所以我不想通过列分配它
我正在做这样的事情(只有摘要)
foreach (string colname in sourceColumnNames)
{
if (!targetColumnNames.Contains(colname)) continue;
// There are other steps as well
tRow[colname] = sRow[colname];
}
但不是很最佳。
我正在尝试使用ItemArray进行操作。因此,我可以一次复制整个数组(仅我需要的列)。我的想法是匹配源表和目标表之间的列名,并将其存储在字典中,并从该字典中制作一个项目数组。
是否有其他最佳方法在两个数据表之间复制特定列,而无需通过每个列
您可以使用DataTable.Load
方法。它将源行复制到目标表,您不必担心列映射。一个示例如何做:
dataTable2.Load(dataTable1.CreateDataReader());
有关DataTable.Load
的更多信息,请在此处查看
基于您的示例,您正在检查每个行的常见列。由于这些列对于每一行都是相同的,您只需要一次执行此操作即可。这是我解决它的想法:
第一步是创建从表1到表2的列的映射:
//Create a mapping
List<Tuple<int, int>> columnMappings = new List<Tuple<int, int>>();
for (int dt1ColumnIndex = 0; dt1ColumnIndex < dt1.Columns.Count; dt1ColumnIndex++)
{
string columnName = dt1.Columns[dt1ColumnIndex].ColumnName;
if (dt2.Columns.Contains(columnName) == true)
{
int dt2ColumnIndex = dt2.Columns.IndexOf(columnName);
columnMappings.Add(new Tuple<int, int>(dt1ColumnIndex, dt2ColumnIndex));
}
}
现在,您可以迭代第一个表的所有行,创建新行到表2:
//Add all rows from table 1 to table two based on the mapping
foreach (DataRow dt1Row in dt1.Rows)
{
DataRow dt2Row = dt2.NewRow();
foreach (Tuple<int, int> columnMapping in columnMappings)
{
dt2Row[columnMapping.Item2] = dt1Row[columnMapping.Item1];
}
dt2.Rows.Add(dt2Row);
}