【问题标题】:how to clone/copy a datatable with only first n columns using linq如何使用 linq 克隆/复制只有前 n 列的数据表
【发布时间】:2014-04-26 12:02:01
【问题描述】:

我有一个包含 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 负担过重。

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

【问题讨论】:

  • "但是 CPU 和内存太重了。" ?我没有意识到还有 286 还剩.... :)
  • 内存不足异常被抛出。我不能增加内存。我知道为什么会出现异常,因为在第二个 for 循环中创建的对象没有被释放。服务器是 XP,只有 1 GB 内存,总是满的。
  • 请注意,DataTable 一次将其所有数据保存在内存中。如果您接受 DataTable 并生成 DataTable 结果,那么简单的解决方案通常需要两个表的内存使用。结果是用来做什么的?输入来自哪里?这些是可以通知更改方法签名的关键信息,从而为解决方案留出更多喘息空间。

标签: c# asp.net linq datatable


【解决方案1】:

试试这个:

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

 return dt.CopyToDataTable();
}

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

【讨论】:

  • 这只是给出了前 11 行。 OP 似乎想要每行前 11 列中的数据。
【解决方案2】:

你可以试试这个。唯一的区别是 object[] ob = table.Rows[i].ItemArray 而不是 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();

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 2018-06-01
    • 2018-04-01
    • 2020-08-24
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    相关资源
    最近更新 更多