草庐IT

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

codeneng 2023-03-28 原文

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.NewRowrow("Year")=ytbl.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 每次都会获胜。

有关关于 .net:立即执行 LINQ 查询最便宜的方法是什么的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  5. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  6. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  7. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  8. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  9. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  10. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

随机推荐