linq过滤列而不是数据

linq filter columns rather than data

首先,我不确定我问的问题是否可行,如果我问的是一个愚蠢的问题,我深表歉意。

所以我能够使用 linq 过滤 DataTable 来获取我需要的数据,我想知道是否可以使用类似的语句过滤列。

例如,如果我有以下数据表dtMyData

ID Name 1 2 3 4
1 Conor 100 87 3 0
2 Frank 35 70 0 0
3 Jeff 35 13 0 57

我可以使用以下语句将其过滤到下面

dtMyData = dtMyData.AsEnumerable().Where(Function (f) f("Name").ToString().Equals("Frank")).CopyToDataTable
ID Name 1 2 3 4
2 Frank 35 70 0 0

我想要做的(如果可能的话)是以类似的方式过滤列,这样我就可以 select 所有 > 2 的列加上前 2 列。给我以下列

ID Name 3 4
1 Conor 3 0
2 Frank 0 0
3 Jeff 0 57

看看这个方法:

Private Function CopyTable(source As DataTable, columnsToKeep As IEnumerable(Of String)) As DataTable
    Dim copiedTable As DataTable = source.Clone()
    Dim columnsToRemove() As DataColumn = copiedTable.Columns.Cast(Of DataColumn).Where(Function(column) Not columnsToKeep.Contains(column.ColumnName)).ToArray()
    For i As Integer = 0 To columnsToRemove.Length - 1
        copiedTable.Columns.Remove(columnsToRemove(i))
    Next
    For Each row As DataRow In source.Rows
        Dim values As New List(Of Object)
        For Each column As DataColumn In copiedTable.Columns
            values.Add(row.Item(column.ColumnName))
        Next
        copiedTable.Rows.Add(values.ToArray())
    Next
    Return copiedTable
End Function

这样做的是

  1. 克隆数据表
  2. 遍历复制的 DataTable 并删除不在 columnsToKeep
  3. 中的列
  4. 遍历原始数据表并将行添加到复制的数据表中,不包含不在 columnsToKeep
  5. 中的单元格

Fiddle: https://dotnetfiddle.net/2l6wk9

编辑

实际上使用 DataTable.CopyDataTable.Clone 更容易,我很抱歉:

Private Function CopyTable(source As DataTable, columnsToKeep As IEnumerable(Of String)) As DataTable
    Dim copiedTable As DataTable = source.Copy()
    Dim columnsToRemove() As DataColumn = copiedTable.Columns.Cast(Of DataColumn).Where(Function(column) Not columnsToKeep.Contains(column.ColumnName)).ToArray()
    For i As Integer = 0 To columnsToRemove.Length - 1
        copiedTable.Columns.Remove(columnsToRemove(i))
    Next
    Return copiedTable
End Function

此更新代码的作用是:

  1. 复制 DataTable 及其数据
  2. 遍历复制的 DataTable 并删除不在 columnsToKeep
  3. 中的列

Fiddle: https://dotnetfiddle.net/NEIm2t