如何使用 linq 克隆/复制仅包含前 n 列的数据表

问题描述 投票:0回答:3

我有一个包含超过 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 的负担太大。

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

c# asp.net linq datatable
3个回答
1
投票

试试这个:

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

 return dt.CopyToDataTable();
}

或者类似的东西。它至少会给你一种解决问题的方法。 请注意,您需要添加对程序集的引用:

System.Data.DataSetExtensions.dll
,然后您可以像上面那样编写函数。


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();

0
投票

如果您知道要保留的列名称,这应该可行:

    NewDataTable = DT.Copy.DefaultView.ToTable(true, "Item", "Standard Number", "Part Size", "Material", "Etc.");

初始

true
Distinct
参数。后面是所需的列名称。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.