我有一个多边形列表和一个检查两个多边形是否相同的函数。我的问题是我想只添加此列表中找到的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
答案 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