复制数据表列

时间:2018-02-21 15:26:28

标签: c# datatable

我有以下方法,根据用户选择要保留的6列,返回数据表的精简副本。我的问题是数据表可能非常大并占用了相当多的内存。通过创建初始副本,这导致系统必须开始写入页面文件并大大减慢应用程序。

我想知道是否可以创建一个数据表副本,但只能创建指定的列(可以通过名称或索引来识别,无关紧要),而不是创建副本然后删除不必要的列?

This问题似乎是在VB.net中提出同样的问题。

private DataTable CreateCleanData()
{
    var cleanedDataTable = _loadedDataData.Copy();
    var columnsToKeep = new List<string>();
    columnsToKeep.Add(1.SelectedValue.ToString());
    columnsToKeep.Add(2.SelectedValue.ToString());
    columnsToKeep.Add(3.SelectedValue.ToString());
    columnsToKeep.Add(4.SelectedValue.ToString());
    columnsToKeep.Add(5.SelectedValue.ToString());
    columnsToKeep.Add(6.SelectedValue.ToString());

    for (var i = cleanedDataTable.Columns.Count - 1; i >= 0; i--)
        if (!columnsToKeep.Contains(cleanedDataTable.Columns[i].ColumnName))
            cleanedDataTable.Columns.Remove(cleanedDataTable.Columns[i]);
    cleanedDatTable.AcceptChanges();
    GC.Collect();

    return cleanedDataTable;
}

1 个答案:

答案 0 :(得分:1)

您可以使用此方法,基本上只使用Clone代替Copy

public static DataTable CreateCleanData(DataTable source, params int[] keepColumns)
{
    var cleanedDataTable = source.Clone(); // empty table but same columns

    for (int i = cleanedDataTable.Columns.Count - 1; i >= 0; i--)
    {
        if (!keepColumns.Contains(i))
            cleanedDataTable.Columns.RemoveAt(i);
    }

    cleanedDataTable.BeginLoadData();
    foreach (DataRow sourceRow in source.Rows)
    {
        DataRow newRow = cleanedDataTable.Rows.Add();
        foreach (DataColumn c in cleanedDataTable.Columns)
        {
            newRow.SetField(c, sourceRow[c.ColumnName]);
        }
    }
    cleanedDataTable.EndLoadData();

    return cleanedDataTable;
}