关于 .net:立即执行 LINQ 查询最便宜的方法是什么 | 珊瑚贝

What is the cheapest way to execute a LINQ-Query immediately


在为 SO-answer 生成示例数据时,我想到了这个问题。
我不喜欢通过 Tbl.Rows.Add 逐一添加 DataRows 的冗长方式,所以我创建了这个伪 LINQ 查询,它除了隐式添加行之外什么都不做:

1
2
3
4
5
6
7
8
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 行代码减少到一行,但注意到我需要某种数据源用于 LINQ 查询。因此我创建了数组。但此时我也可以简单地使用 for-each 循环来添加 DataRows。

结论:将 LINQ 查询用于它的用途:查询。那么这个问题是没有意义的,因为没有最便宜的方法,只有返回正确结果的方法。

  • foreach 不会产生更易读的代码吗?这看起来像是一个使用 LINQ 的案例,只是因为我可以。这也有点反 LINQ,因为它有副作用。
  • LINQ 不保证会发生任何副作用:例如,LINQ-to-objects 可以以 Count 忽略任何任何 Select 投影的方式实现,因为它们不会更改元素的数量。因此,您依赖于未记录的行为,该行为可能(理论上)随时改变。
  • 你的核心问题应该被回答,你不应该那样做。您正试图用投影代替动作。然后,您强制实现以强制执行您的副作用(预期的操作)。
  • 1 的答案是这个问题的灵感。
  • @Marc:是的,你是对的。不幸的是,这个例子没有我想象的那么好。首先,我通过简单地创建新行 (tbl.NewRow)、填充它们并最后将它们添加到 DataTable 来创建没有循环的 DataTable。所以我问自己这 20 行代码是否没有单行代码。因此我创建了那个数组。在这一点上,我也可以使用 for-each 。在创建 LINQ 查询之后,我错过了这一点。


我只是将它重写为 foreach:

1
2
3
For Each y As String in years
    tbl.Rows.Add(y)
Next

这样更清楚你的意图是什么,并且立即执行。

  • 你说的对。我的第一种方法不是使用 tbl.Rows.Add,而是从 Dim row=tbl.NewRow、row(“Year”)=y、tbl.Rows.Add(row) 创建 DataRow。这就是我所说的冗长的意思。在这种情况下,我也可以简单地使用 for each 。现在缺少一个很好的例子。


我更倾向于使用 List(Of T):

1
2
3
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))

不过,这都是主观的,对于这些衬垫来说,循环可能是最清晰的。

  • 好的,这将是对 ForEach() 方法的合理使用。
  • 不是 vb.net 的人,我不知道 ForEach 的 lambda 版本。比起我自己的答案,我更喜欢这种方式。
  • @tzaman 测试台?我可能会同意。对于生产代码,我认为您的 ForEach 每次都会获胜。


来源:https://www.codenong.com/9010639/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_8906.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?