【发布时间】:2010-07-26 11:00:09
【问题描述】:
给定一个包含两列的数据表,如下所示:
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
你会使用这个 sn-p 来检索包含所有 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。
对于那些感兴趣的人:我对这两个版本都进行了一些迭代,结果得到了以下性能图表:
纵轴显示代码将行 ID 转换为通用列表所需的毫秒数,横轴显示行数。蓝线来自命令式方法(forloop),红线来自声明性代码(linq)。
无论您通常选择哪种方式:为什么您选择那条路而不是另一条路?
【问题讨论】: