使用列表从数据表中提取列



我可以成功地从DataTable(DT(中提取列x1、x2和x3,例如使用

Dim arrayOfObjects()() As Object = DT.AsEnumerable().Select(Function(b) {b("x1"), b("x2"), b("x3")}).ToArray()

然而,我的大多数提取都会涉及不同的列组合,所以在这种情况下,我会带着列名的列表或字符串数组到达,然后更喜欢基于列表或数组提取列。如何做到这一点?我还没有见过这样的用例:可以将字段名连接在一个字符串中,并将其插入Select命令中进行提取。

我正在设想使用类似的东西

Dim mystr As String = "x1,x2,x3" 
Dim arrayOfObjects()() As Object = DT.AsEnumerable().Select(mystr}).ToArray()

您可以替换:

Dim arrayOfObjects()() As Object = DT.AsEnumerable().Select(Function(b) {b("x1"), b("x2"), b("x3")}).ToArray()

带有:

Dim mystr As String = "x1,x2,x3"
Dim tarCols As String() = mystr.Split({","}, StringSplitOptions.RemoveEmptyEntries)
' Shortcut
' Dim tarCols = { "x1", "x2", "x3" }
Dim arrayOfObjects As Object()() = dt.DefaultView.ToTable(False, tarCols).
AsEnumerable().Select(Function(x) x.ItemArray).ToArray()

提取任意给定的一个或多个DataColumn的值并创建锯齿状数组。

我创建了一个DataTable,并在Form.Load中添加了几行

Cols是我希望在新的DataTable中使用的列名的String数组。这里的神奇之处在于这里记录的.ToTable方法MS Docs

Private dt As New DataTable
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
With dt.Columns
.Add("Number")
.Add("Name")
.Add("LastName")
End With
dt.Rows.Add({"Mary", "Ruth", "Morrison"})
dt.Rows.Add("William", "James", "Patrick")
DataGridView1.DataSource = dt
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Cols = {"Number", "LastName"}
Dim rows = dt.DefaultView.ToTable(False, Cols)
DataGridView1.DataSource = rows
End Sub

最新更新