Mep*_*toe 2 linq vb.net for-loop
给定一个包含两列的数据表,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
您是否会使用此代码段来检索包含所有Id的List(Of Integer):
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
Run Code Online (Sandbox Code Playgroud)
或者更确切地说这个:
Dim list2 = (From r In table.AsEnumerable _
Select r.Field(Of Integer)("Id")).ToList()
Run Code Online (Sandbox Code Playgroud)
这不是关于是否通过使用.Field(Of Integer),CType,CInt,DirectCast或者其他任何方式将Id列类型转换为Integer的问题,但通常是关于您是否选择Linq而不是主题暗示的forloops.
对于那些感兴趣的人:我对两个版本进行了一些迭代,从而产生了以下性能图:
垂直轴显示代码将行的ID转换为通用列表所用的毫秒数,其中行数显示在水平轴上.蓝线来自命令式方法(forloop),来自声明性代码(linq)的红线.
无论你通常选择哪种方式:为什么你这样走而不是另一个?
只要有可能,我赞成编程的声明方式而不是命令式.当您使用声明性方法时,CLR可以根据计算机的特性优化代码.例如,如果它有多个核心,它可以并行执行,而如果你使用命令式循环,你基本上锁定了这种可能性.今天也许没有什么大不同,但我认为将来会出现越来越多像PLINQ这样的扩展,从而实现更好的优化.