如何使用linq克隆/复制只有前n列的数据表

时间:2014-04-26 12:02:01

标签: c# asp.net linq datatable

我有一个包含100多列的数据表,但我需要删除所有列 除了前11列。 我需要保留前11列的数据。 我正在使用以下代码

public DataTable validdatatable(DataTable table)
{
     DataTable dt = new DataTable();
     for (int i = 0; i < 11; i++)
     {
          DataColumn dc = new DataColumn();
          dc.ColumnName = table.Columns[i].ColumnName;
          dc.DataType = table.Columns[i].DataType;
          dt.Columns.Add(dc);
     }
     for (int i = 0; i < table.Rows.Count; i++)
     {
          object[] ob = table.Rows[i].ItemArray;
          ...
          ...
     }
     return dt;
}

这种方法有效,但在CPU和Ram上太重了。

我还有其他方法可以继续吗?

2 个答案:

答案 0 :(得分:1)

试试这个:

public DataTable validdatatable(DataTable table)
{
 var dt = table.Columns.Cast<DataColumn>().Take(11);

 return dt.CopyToDataTable();
}

或类似的东西。它至少会给你一种方法来处理它。 请注意,您需要添加对程序集的引用:System.Data.DataSetExtensions.dll然后您可以像上面一样编写函数。

答案 1 :(得分:0)

你可以试试这个。唯一的区别是object [] ob = table.Rows [i] .ItemArray它只使用索引获取前11列并从中生成一个数组(itemArray将生成所有100列的数组)。仍然怀疑如果你这么紧,这将解决你的记忆问题,但它可能值得一试。

var copyDt = new DataTable();
for (var i = 0; i < 11; i++)
{
    copyDt.Columns.Add(dataTable.Columns[i].ColumnName, dataTable.Columns[1].DataType);
}
copyDt.BeginLoadData();
foreach (DataRow dr in dataTable.Rows)
{
    copyDt.Rows.Add(Enumerable.Range(0, 11).Select(i => dr[i]).ToArray());
}
copyDt.EndLoadData();