2014-09-25 55 views
0

我有一个多边形列表和一个函数,检查两个多边形是否相同。我的问题是我想添加在这个列表中找到n个相同的多边形中只有一个。如果多边形是唯一的,那么它会被添加到唯一列表中。我怎样才能调整我的下面的代码来做到这一点:嵌套for循环:从多边形列表中删除相同的多边形

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)通过这种方式投指数超出范围的异常,因为列表成员的数量有所减少。

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)此抛出名单已经改变了异常:

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 

回答

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 
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