gpt4 book ai didi

vb.net - 你选择 Linq 而不是 For 循环?

转载 作者:行者123 更新时间:2023-12-01 09:38:44 25 4
gpt4 key购买 nike

给定一个包含两列的数据表,如下所示:

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

您会使用此代码段来检索包含所有 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

或者更确切地说是这个:

Dim list2 = (From r In table.AsEnumerable _
Select r.Field(Of Integer)("Id")).ToList()

这不是关于是否使用 .Field(Of Integer)、CType、CInt、DirectCast 或其他任何方式将 Id 列类型转换为 Integer 的问题,而是关于您是否像主题暗示的那样选择 Linq 而不是 forloops 的问题。


对于那些感兴趣的人:我对这两个版本都进行了一些迭代,结果得到了以下性能图表:

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

纵轴显示代码将行 ID 转换为通用列表所需的毫秒数,横轴显示行数。蓝线来自命令式方法(forloop),红线来自声明性代码(linq)。


无论您通常选择哪种方式:为什么您选择那条路而不是另一条路?

最佳答案

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

关于vb.net - 你选择 Linq 而不是 For 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3334185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com