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
这样做的是
- 克隆数据表
- 遍历复制的 DataTable 并删除不在
columnsToKeep
中的列
- 遍历原始数据表并将行添加到复制的数据表中,不包含不在
columnsToKeep
中的单元格
Fiddle: https://dotnetfiddle.net/2l6wk9
编辑
实际上使用 DataTable.Copy
比 DataTable.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
此更新代码的作用是:
- 复制 DataTable 及其数据
- 遍历复制的 DataTable 并删除不在
columnsToKeep
中的列
Fiddle: https://dotnetfiddle.net/NEIm2t
首先,我不确定我问的问题是否可行,如果我问的是一个愚蠢的问题,我深表歉意。
所以我能够使用 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
这样做的是
- 克隆数据表
- 遍历复制的 DataTable 并删除不在
columnsToKeep
中的列
- 遍历原始数据表并将行添加到复制的数据表中,不包含不在
columnsToKeep
中的单元格
Fiddle: https://dotnetfiddle.net/2l6wk9
编辑
实际上使用 DataTable.Copy
比 DataTable.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
此更新代码的作用是:
- 复制 DataTable 及其数据
- 遍历复制的 DataTable 并删除不在
columnsToKeep
中的列
Fiddle: https://dotnetfiddle.net/NEIm2t