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