你选择Linq而不是Forloops吗?

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.


对于那些感兴趣的人:我对两个版本进行了一些迭代,从而产生了以下性能图:

图http://dnlmpq.blu.livefilestore.com/y1pOeqhqQ5neNRMs8YpLRlb_l8IS_sQYswJkg17q8i1K3SjTjgsE4O97Re_idshf2BxhpGdgHTD2aWNKjyVKWrQmB0J1FffQoWh/analysis.png?psid=1

垂直轴显示代码将行的ID转换为通用列表所用的毫秒数,其中行数显示在水平轴上.蓝线来自命令式方法(forloop),来自声明性代码(linq)的红线.


无论你通常选择哪种方式:为什么你这样走而不是另一个?

Dar*_*rov 5

只要有可能,我赞成编程的声明方式而不是命令式.当您使用声明性方法时,CLR可以根据计算机的特性优化代码.例如,如果它有多个核心,它可以并行执行,而如果你使用命令式循环,你基本上锁定了这种可能性.今天也许没有什么大不同,但我认为将来会出现越来越多像PLINQ这样的扩展,从而实现更好的优化.