使用C#复制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进行操作。因此,我可以一次复制整个数组(仅我需要的列)。我的想法是匹配源表和目标表之间的列名,并将其存储在字典中,并从该字典中制作一个项目数组。

是否有其他最佳方法在两个数据表之间复制特定列,而无需通过每个列

您可以使用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);
}

最新更新