Imports System.Collections.Generic
Dim originalTable As New DataTable("OriginalTable")
originalTable.Columns.AddRange({
New DataColumn("Id", GetType(Int32)) With { .AutoIncrement = True},
New DataColumn("One", GetType(Int32)) With { .Caption = "1" },
New DataColumn("Two", GetType(Int32)) With { .Caption = "2" },
New DataColumn("Three", GetType(Int32)) With { .Caption = "3" },
New DataColumn("Four", GetType(Int32)) With { .Caption = "4" }
originalTable.Rows.Add({1, "Conor", 100, 70, 3, 0})
originalTable.Rows.Add({1, "Frank", 35, 70, 0, 0})
originalTable.Rows.Add({1, "Jeff", 35, 13, 0, 57})
Console.WriteLine("originalTable")
PrintDataTable(originalTable)
Dim copiedTable As DataTable = CopyTable(originalTable, {"Id", "Name", "Three", "Four"})
Console.WriteLine("originalTable")
PrintDataTable(copiedTable)
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))
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))
copiedTable.Rows.Add(values.ToArray())
Private Sub PrintDataTable(table As DataTable)
For Each row As DataRow In table.Rows
Console.WriteLine(String.Join(" | ", row.ItemArray()))