我想采用现有的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();
答案 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);
}