嵌套For循环:从多边形列表中删除相同的多边形

时间:2014-09-25 08:59:57

标签: vb.net

我有一个多边形列表和一个检查两个多边形是否相同的函数。我的问题是我想只添加此列表中找到的n个相同多边形中的一个。如果多边形是唯一的,则会将其添加到唯一列表中。我如何调整以下代码来执行此操作:

    Dim bIdentical As Boolean = False
    Dim bTwinAdded As Boolean = False
    For Each outerEle As clsElement In liAllPolygons
        'bTwinAdded = False
        bIdentical = False
        For Each innerEle As clsElement In liAllPolygons
            If outerEle.Equals(innerEle) Then Continue For
            If ClsMath.AreTwoPolygonsIdentical2(outerEle.Nodes, innerEle.Nodes) Then
                bIdentical = True
                Exit For
            End If
        Next

        If Not bIdentical Then liUniquePolygons.Add(outerEle)
        If bIdentical AndAlso Not bTwinAdded Then
            liUniquePolygons.Add(outerEle)
            bTwinAdded = True
        End If

我根本无法思考我能做些什么。在10个多边形的列表中给出,数字3,4是相同的,数字9,10是相同的,然后列表liUniquePolygons应该只获得数字3和数字9以及列表的其余部分。使用上面的代码,可以添加除了编号4,9和10之外的所有多边形的编号。

编辑:

1)这种方式会抛出Index Out Of Range Exception,因为列表成员的数量已经减少。

For outerCount As Integer = 0 To liAllPolygons.Count - 1
        'bTwinAdded = False
        bIdentical = False
        For innerCount As Integer = 0 To liAllPolygons.Count - 1
            If liAllPolygons(outerCount).Equals(liAllPolygons(innerCount)) Then Continue For
            If ClsMath.AreTwoPolygonsIdentical2(liAllPolygons(outerCount).Nodes, liAllPolygons(innerCount).Nodes) Then
                liAllPolygons.RemoveAt(innerCount)
            End If
        Next
    Next

2)这会抛出List已更改的异常:

 For Each outerEle as clsElement in liAllPolygons
        'bTwinAdded = False
        bIdentical = False
        For Each innerEle as clsElement in liAllPolygons
            If outerEle .Equals(innerEle ) Then Continue For
            If ClsMath.AreTwoPolygonsIdentical2(outerEle .Nodes, innerEle.Nodes) Then
                liAllPolygons.Remove(innerEle)
            End If
        Next
    Next

2 个答案:

答案 0 :(得分:1)

下面将根据您的函数AreTwoPolygonsIdentical2进行比较,生成一个唯一对象列表。

这确实有点浪费,但它应该有用......

For Each outerEle In liAllPolygons

        'Compare outerEle  to all other items and see if there are identical matches
        Dim isIdentical As Boolean = False 'set a flag to indicate a match was found

        For Each innerEle In liAllPolygons

            If outerEle.Equals(innerEle) Then Continue For 'ignore the innerEle that is literaly the same as the outerEle

            'if the innerEle and outerEle are the same
            If ClsMath.AreTwoPolygonsIdentical2(innerEle.Nodes, outerEle.Nodes) Then
                'this item is not a unique item
                isIdentical = True
                Exit For
            End If

        Next

        If Not isIdentical Then
            'if the item is unique, add it to the unique items list
            liUniquePolygons.Add(outerEle)
        Else
            'the item has a twin, we need to look at our list of unique items and see if we've already added the match
            Dim isMatchAdded As Boolean = False
            For Each uniqueEle In liUniquePolygons
                If ClsMath.AreTwoPolygonsIdentical2(uniqueEle.Nodes, outerEle.Nodes) Then
                    isMatchAdded = True
                    Exit For
                End If
            Next

            'we have nomatching items in the list, add it in
            If Not isMatchAdded Then
                liUniquePolygons.Add(outerEle)
            End If

        End If

    Next

答案 1 :(得分:0)

我得到了这个:

For outerCount As Integer = 0 To liAllPolygons.Count - 1

        If outerCount > liAllPolygons.Count - 1 Then Exit For

        For innerCount As Integer = 0 To liAllPolygons.Count - 1

            If innerCount > liAllPolygons.Count - 1 Then Exit For

            If liAllPolygons(outerCount).Equals(liAllPolygons(innerCount)) Then Continue For
            If ClsMath.AreTwoPolygonsIdentical2(liAllPolygons(outerCount).Nodes, liAllPolygons(innerCount).Nodes) Then
                liAllPolygons.RemoveAt(innerCount)
                'GoTo Reset
            End If
        Next
    Next