query从数据表到带过滤器的数据视图的数据



我有数据表"dataitem "包含98000行,Datagridview有11000行

想要将数据表中的数量添加到datagridview

我正在使用这个代码,但是它需要太多太多的时间来运行,有时会停止响应,我需要一些想法来让它运行得更快

Dim dt As New DataTable = najrndataset.dataitems
Dim Total As Integer    
for x = 0 to datagridview1.rows.count -1
Dim b = datagridview1.rows(x).cells(1)
Dim c = 3
Total = (From r As DataRow In dt.AsEnumerable
             Where r.Field(Of String)("Item_Number") = b And r.Field(Of Integer)("SOP_Type") = c
             Select r.Field(Of Integer)("Quantity")).Sum
    datagridview1.Rows(x).Cells(0).Value = Total
next

希望你能理解,如果你在一个datagridview中有11000行(顺便说一下,这个想法很糟糕),在一个数据表中有98000行,你正在运行一个循环,在表中搜索11K项中的每一个,它通过从1开始,搜索98000项,然后到2,搜索98000项,直到你达到11000,搜索98000项……在操作结束时,您将执行11000 x 98000次操作。也就是说,你要执行 10.78 BILLION操作。这就是为什么"要花太多太多的时间运行,有时会停止响应"的原因。:)

您可以通过使用字典来跟踪总和来加快速度,并且它可能是最快的索引98000项,然后从它们设置字典:

Dim d as New Dictionary(Of String, Integer)
For Each di In najrndataset.dataitems.Where(Function(r) r.SOP_Type = 3)
  If Not d.ContainsKey(di.Item_Number) Then 
    d(di.Item_Number) = di.Quantity
  Else
    d(di.Item_Number) += di.Quantity
  End If
Next di

然后编辑你的网格(ugh;这不是datagridview应该如何使用)

datagridview1.SuspendDrawing()

For x = 0 to datagridview1.rows.count - 1
  Dim b = datagridview1.rows(x).cells(1)
  Dim s As Integer
  If d.TryGetValue(b, s) Then
    datagridview1.rows(x).cells(0) = s
  End If
Next x
datagridview1.ResumeDrawing()

你也可以有这样的逻辑:"循环遍历数据网格,将11000项放入字典中;如果键存在于字典中,则循环遍历数据表,将和放入字典中;">

不是答案,但是对于传统的注释来说太长了。我正在努力提供一个单独的答案。


我不能告诉你我看到过多少次这样的代码:

Dim someVariable As New SomeObject
someVariable = someMethodToReturnSomeObject()

这个模式是糟糕的代码!

第一行的New操作符告诉编译器您想要分配内存并为您的类型运行构造函数。然而,下一行赋值了一个新对象…它抛弃并忘记了前一行的内存和构造函数工作。这就是浪费。

你应该这样写:

Dim someVariable As SomeObject = someMethodToReturnSomeObject()

更糟糕的是,这表明对引用和对象之间的区别以及计算机对内存中的代码所做的工作缺乏理解。这是许多编程环境如何工作的核心原则。像第一个例子这样的代码让我对编写它的程序员的能力产生了很大的怀疑。

最新更新