在为SO答案生成样本数据时,我想到了这个问题。
我不喜欢通过Tbl.Rows.Add
逐个添加DataRows的冗长方式,所以我创建了这个伪LINQ查询,除了隐含地添加行之外什么都不做:
Private Function GetData() As DataTable
Dim years = {"2010/2009", "2009/2008", "2008/2007", "2007/2006", "2006/2005", "2005/2004", "2004/2003"}
Dim tbl = New DataTable
tbl.Columns.Add(New DataColumn("Year"))
' adds DataRows to the DataTable, need Count to execute the query '
Dim c = (From y In years Select tbl.Rows.Add(y)).Count
Return tbl
End Function
如您所见,我根本不需要查询结果,唯一的目的是迭代并调用DataTable.Rows.Add
。因此,结果已经在DataTable本身中可用,而不需要查询。
不可否认,这个问题有点不合理,因为使用f.e.会有很大的不同。 ToList
通常查询的目的是返回一些内容。
但是,无论如何,当只执行而不是结果很重要时,执行LINQ查询的最便宜的方式(就内存消耗,执行时间而言)是什么?
编辑:好的,这个问题是一个快速拍摄和鸡蛋问题。我想将20行代码减少到一行,但注意到我需要某种类型的DataSource用于LINQ-Query。因此我创建了阵列。但是在这一点上我可以简单地使用for-each循环来添加DataRows。
结论:使用LINQ-Query获取它的用途:查询。那么这个问题毫无意义,因为没有最便宜的方式,只有返回正确结果的方法。
答案 0 :(得分:9)
我只是将其重写为foreach
:
For Each y As String in years
tbl.Rows.Add(y)
Next
通过这种方式更清楚你的意图是什么,并立即执行。
答案 1 :(得分:2)
我更倾向于使用List(Of T)
:
Dim years As New List(Of String) From {"2010/2009", "2009/2008", "2008/2007", "2007/2006", "2006/2005", "2005/2004", "2004/2003"}
years.ForEach(Sub(y) tbl.Rows.Add(y))
虽然这一切都是主观的,但对于这些衬里来说,循环可能是最清楚的。