【问题标题】:How to avoid using two nested for-loops for two related DataTables如何避免对两个相关的 DataTable 使用两个嵌套的 for 循环
【发布时间】:2019-11-15 02:58:56
【问题描述】:

试图避免在下面的代码中使用两个嵌套的 for 循环,但我似乎想不出一种无需使用两个 for 循环即可加入两个 DataTable 的方法。请注意,两个 DataTable 都是动态的,这就是为什么我无法在 SQL Query 级别解决问题的原因。

下面的 DataTable 从数据库中获取所有部分。他们是 数量有限但充满活力。

Dim dtSections As DataTable = HomeSections()

遍历各个部分并获取每个部分的所有相关项:

If dtSections.Rows.Count > 0 Then   
    For Each mySectionRow As DataRow In dtSections.Rows 
        Dim dtItems As DataTable = getItemsBySection(sectionId)
        If dtItems.Rows.Count > 0 Then
           For Each myItemRow As DataRow In dtItems.Rows
               'Some HTML population
           Next 
        End if
   Next 
End if

我想知道当第二个 DataTable 的值取决于第一个 DataTable 的值时,避免使用嵌套 for 循环的最佳方法是什么。我曾想过使用 DataSet,但我认为我无法根据第一个 DataTable 的结果生成第二个 DataTable。

这个问题应该在代码层面解决还是在SQL层面(比如存储过程)解决?

【问题讨论】:

  • 为什么要首先避免嵌套循环?
  • @jmcilhinney O(n) 优于 O(n2)。尝试改进 TTFB。
  • 我们在谈论多少数据? “请注意,两个数据表都是动态的”。这甚至意味着什么?
  • O(n)... 您希望在嵌套循环中处理多少条记录?
  • @jmcilhinney 少于 300 条记录。

标签: vb.net performance for-loop optimization datatable


【解决方案1】:

您可以使用 LINQ 连接两个数据表

Dim query = From mySectionRow  In dtSections
                    Join myItemRow  In dtItems
                    On mySectionRow!sectionId Equals myItemRow!sectionId
                    Select mySectionRow!sectionId, myItemRow!sectionId

For Each q In query
    'Some HTML population
Next

【讨论】:

  • 如果我已经填写了 dtItems 数据表,那可以工作,对吧?
  • 是的!填不填,没关系。
  • Items 表可能达到一百万行甚至更多。从表中拉出所有数据是不是错了?我只为每个循环的每个部分提取 20 条记录。我在这里看到了您的建议(在代码级别而不是 SQL 级别进行连接),但是随着表格大小变大,这不会成为问题吗?
  • 如果你可能有很多行的数据表,你应该考虑 T-SQL 解决方案。
猜你喜欢
  • 2018-10-12
  • 2011-06-21
  • 2020-12-01
  • 2012-06-25
  • 2023-03-15
  • 2016-01-23
  • 2017-01-01
  • 2021-09-15
  • 2017-08-27
相关资源
最近更新 更多