优化嵌套for循环

时间:2016-01-14 09:23:06

标签: optimization treeview nested-loops gmap.net

我使用GMAP.Net库作为映射窗口应用程序。 我的Sql Server数据库上有大约17000个多边形。在表单加载事件中,我从数据库中选择所有多边形并填充数据表,然后从数据表中逐个绘制多边形。 我还有一个树视图,我将所有17000个多边形名称添加到该树视图中。 现在,当我选中treeview上的select all复选框时,我在Treeview中调用一个函数node_AfterCheck事件,如下所示:

a -> Bool

此代码大约需要40秒才能完全运行。有没有办法优化此代码以在更短的时间内完成?

2 个答案:

答案 0 :(得分:1)

我可以看到代码昂贵的一件事就是在多边形的标签上调用Split。但这将受到衡量。

要绕过Split,例如尝试使用:

If _polygon.Tag.StartsWith(node1.Name) Then

考虑this question,了解IsPrefix是否更快。

然而,我假设主要的麻烦是在设置每个多边形的可见性时不断刷新/重绘地图(“自动刷新”)。我在消息来源中发现的一件事是将Invalidation置于保持状态:

// docs: stops immediate markers/route/polygon invalidations; call Refresh to perform single refresh and reset incalidation state
gmap2.HoldInvalidation = true;

// do your update loop within here

// docs: call this to stop HoldInvalidation and perform single forced instant refresh
gmap2.Refresh();

现在没有机会尝试一下,但我想你可以继续尝试,看看是否有所作为。

答案 1 :(得分:0)

感谢您的快速回复,我改变了我的代码:

Private Sub GetPolygons(node As TreeNode)

        myMap.HoldInvalidation = True

        Dim objectId As String
        Dim _polygon As GMapPolygon
        For Each node1 As TreeNode In node.Nodes
            objectId = node1.Name

            For Each _polygon In polyOverlay.Polygons.AsParallel
                itemTag = _polygon.Tag.ToString.Split("|")
                If itemTag (0) = node1.Name Then
                    _polygon.IsVisible = node.Checked
                    Exit For
                End If
            Next
        Next

        myMap.Refresh()

结束子

但是代码比以前需要更长的时间才能完成。