Учитывая данные, содержащие два столбца, как это:
Private Function CreateDataTable() As DataTable
Dim customerTable As New DataTable("Customers")
customerTable.Columns.Add(New DataColumn("Id", GetType(System.Int32)))
customerTable.Columns.Add(New DataColumn("Name", GetType(System.String)))
Dim row1 = customerTable.NewRow()
row1.Item("Id") = 1
row1.Item("Name") = "Customer 1"
customerTable.Rows.Add(row1)
Dim row2 = customerTable.NewRow()
row2.Item("Id") = 2
row2.Item("Name") = "Customer 2"
customerTable.Rows.Add(row2)
Dim row3 = customerTable.NewRow()
row3.Item("Id") = 3
row3.Item("Name") = "Customer 3"
customerTable.Rows.Add(row3)
Return customerTable
End Function
Использовали бы этот фрагмент для получения списка (целого числа), содержащего все идентификаторы:
Dim table = CreateDataTable()
Dim list1 As New List(Of Integer)
For i As Integer = 0 To table.Rows.Count - 1
list1.Add(CType(table.Rows(i)("Id"), Integer))
Next
Вернее, этот:
Dim list2 = (From r In table.AsEnumerable _
Select r.Field(Of Integer)("Id")).ToList()
Это не вопрос о том, следует ли типизировать приведение столбца Id к Integer, используя .Field (Of Integer), CType, CInt, DirectCast или что-то еще, но обычно о том, выбираете ли вы Linq вместо forloops, как предполагает субъект.
Для тех, кто заинтересован: я выполнил несколько итераций с обеими версиями, которые привели к следующему графику производительности:
график http://dnlmpq.blu.livefilestore.com/y1pOeqhqQ5neNRMs8YpLRlb_l8IS_sQYswJkg17q8i1K3SjTjgsE4O97Re_idshf2BxhpGdgHTD2aWNKjyVKWrQmB0J1FffQoWh/analysis.png?psid=1
На вертикальной оси показаны миллисекунды, которые потребовался коду для преобразования идентификаторов строк в общий список с количеством строк, показанных на горизонтальной оси. Синяя линия является результатом императивного подхода (forloop), красная линия - декларативным кодом (linq).
Какой бы путь вы обычно не выбирали: почему вы идете этим путем, а не другим?