Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复制数据表列_C#_Datatable - Fatal编程技术网

C# 复制数据表列

C# 复制数据表列,c#,datatable,C#,Datatable,我有以下方法,根据用户选择要保留的6列,返回数据表的精简副本。我的问题是数据表可能相当大,并且占用了相当多的内存。通过创建初始副本,这会导致系统必须开始写入页面文件,从而大大降低应用程序的速度 我想知道是否可以只创建指定列的datatable副本(可以通过名称或索引识别,这无关紧要),而不是创建副本然后删除不必要的列 这个问题似乎在问同样的问题,但在VB.net中 private DataTable CreateCleanData() { var cleanedDataTable = _

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

我想知道是否可以只创建指定列的datatable副本(可以通过名称或索引识别,这无关紧要),而不是创建副本然后删除不必要的列

这个问题似乎在问同样的问题,但在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;
}
private DataTable CreateCleanData()
{
var cleanedDataTable=_loadedDataData.Copy();
var columnsToKeep=新列表();
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());
对于(var i=cleanedDataTable.Columns.Count-1;i>=0;i--)
如果(!columnsToKeep.Contains(cleanedDataTable.Columns[i].ColumnName))
cleanedDataTable.Columns.Remove(cleanedDataTable.Columns[i]);
cleanedDatTable.AcceptChanges();
GC.Collect();
返回干净的数据表;
}

您可以使用此方法,基本上只需使用
克隆
而不是
复制

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;
}

System.InvalidOperationException:'集合已修改;枚举操作可能无法执行。'on line:
foreach(removeColumns中的DataColumn c)
@windowskm:抱歉,现在它应该可以工作了。需要反向循环:)