2014-09-25 58 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