我有两个DataTable。第一个表的列是
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。所以我可以一次复制整个数组(只需要我需要的列)。我的想法是匹配源表和目标表之间的列名称,并将其存储在字典中,并从该字典中创建一个项目数组。
是否有任何其他最佳方法可以复制2个数据表之间的特定列而不通过每列
根据您的示例,您将检查每行的公共列。由于这些列对于每一行都是相同的,因此您只需要执行一次。这是我解决它的想法:
第一步是创建表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);
}
你可以使用DataTable.Load
方法。它将源行复制到目标表,您不必担心列映射。如何做到这一点的一个例子:
dataTable2.Load(dataTable1.CreateDataReader());
有关DataTable.Load
的更多信息,请查看here