【问题标题】:C# linq get subset of datatable from datatable starting from specified ordinal positionC# linq 从特定序数位置开始的数据表中获取数据表的子集
【发布时间】:2017-08-03 02:48:37
【问题描述】:

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

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

我正在尝试按照以下代码 sn-p 的行做一些事情,其中​​ nDataTableColWriteStart 可以是 0(即获取所有列)、1(即从序数位置 1 开始)等。

DataColumns 列表是正确的,但我似乎无法让 sub-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();

【问题讨论】:

    标签: c# linq datatable


    【解决方案1】:

    在您的代码中,您将选择具有所有必需列(即所有行)的所有行,然后将每一行(与所有列一样)添加到新数据表中。

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

    选项 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));
    

    【讨论】:

      【解决方案2】:

      我想出了如何做到这一点,但它并没有完全使用 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);
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多