C#linq从指定的序号位置开始从数据表中获取数据表的子集

时间:2017-08-03 02:48:38

标签: c# linq datatable

我想采用现有的DataTable并通过从指定的序号位置(将DataTable传递给我的方法的位置)获取所有列来创建DataTable的子集。

我看到了类似的帖子,但想要每行中的所有数据。

我试图在下面的代码片段中做一些事情,其中​​nDataTableColWriteStart可以是0(即取所有列),1(即从序号位置1开始)等等。

DataColumns列表是正确的,但我似乎无法让子DataTable只包含那些列。

谢谢,

        List<DataColumn> dataColumns = dt.Columns.Cast<DataColumn>().Where(c => c.Ordinal >= nDataTableColWriteStart).ToList();
        DataTable subTable = dt.Rows.Cast<DataRow>().Where(w => dataColumns.Select(c => w[c]).Any()).CopyToDataTable();

2 个答案:

答案 0 :(得分:1)

在您的代码中,您选择的所有行都包含所有必需的列(可能是所有行),但随后将每行(与所有列一样)添加到新数据表中。

如果您不想改变原始DataTable,则必须执行以下操作之一: 选项1: - 创建一个新的DataTable, - 对于源表中需要的每个列,在目标表中创建一个新列,手动复制所有属性 - 在源表中为每一行创建一个新行,并将新行添加到目标表

选项2: 复制DataTable,删除您不需要的列:

var subTable = dt.Copy();
for (var i = 0; i < nDataTableColWriteStart; i++)
   subTable.Columns.RemoveAt(0);

如果您可以直接从源表中删除列,那么您不需要复制数据表,只需删除列。

如果你坚持使用linq,你可以使用

Enumerable.Range(0, nDataTableColWriteStart).ToList().ForEach(i => subTable.Columns.RemoveAt(0));

答案 1 :(得分:0)

我想出了如何做到这一点,但它并没有完全使用Linq。

        // get the list of columns to remove
        List<DataColumn> dataColumnsToRemove = dt.Columns.Cast<DataColumn>().Where(c => c.Ordinal < nDataTableColWriteStart).ToList();

        // copy the DataTable
        DataTable dtSubset = dt.Copy();

        // remove unwanted columns
        foreach (DataColumn col in dataColumnsToRemove)
        {
            dtSubset.Columns.Remove(col.ColumnName);
        }