使用C#在Datatable中复制特定列(全部一次)

时间:2017-12-20 16:53:24

标签: c# .net datatable

我有两个DataTable。第一个表的列是

  

A B C D E

第二个表的列是

  

B C F D E G

我想复制第一个Table中所有列的数据,其名称存在于第二个表中。

我的表很大,所以我不想按列分配

我正在做类似的事情(只有片段)

b

但它不是最优的。

我正在尝试使用ItemArray。所以我可以一次复制整个数组(只需要我需要的列)。 我的想法是匹配源表和目标表之间的列名称,并将其存储在字典中,并从该字典中创建一个项目数组。

是否还有其他最佳方法可以在两个数据表之间复制特定列而不通过每列

2 个答案:

答案 0 :(得分:1)

您可以使用DataTable.Load方法。它将源行复制到目标表,您不必担心列映射。如何做到这一点的一个例子:

dataTable2.Load(dataTable1.CreateDataReader());

有关DataTable.Load外观here

的详情,请参阅

答案 1 :(得分:0)

根据您的示例,您要检查每行的公共列。由于这些列对于每一行都是相同的,因此您只需要执行一次。这是我解决它的想法:

第一步是创建从表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);
}