我对vb.net相当新,经过几个小时的搜索后找不到任何具体的帮助。
我有一个包含三列的数据点表,第1列是“点ID”,第2列是“x坐标”,第3列是“y坐标”。我需要添加第四列,然后使用迭代过程中的第二个最小值填充它。
迭代过程是找到从该点到另一个点的距离,返回第二个最低值,因为最低值将是0(距离自身的距离)。点1和点2之间距离的数学是sqrt(((x2-x1)(x2-x1))+((y2-y1)(y2-y1)))。
我很想在迭代过程中进行迭代过程,以便重新调整单个值。
任何帮助都会非常感激:)
答案 0 :(得分:1)
遍历表格中的行。然后,对于每一行,再次遍历表中的行。但是当你到达主要迭代当前所在的行时,你可以跳过那一行并继续前进。此外,由于距离在点对之间,因此您只需要遍历表中的一半行以获得所有距离。
如果你发布一些关于你如何实现这一点的更多细节,可能会帮助你解决一些代码问题,但就像现在一样,你甚至不会说你有什么样的表或你的程序如何设置好了,所以很难具体化。
答案 1 :(得分:1)
这是一种可能的解决方案[未经测试]。 AddNearestColumn()
方法循环遍历每一行,并获取到表中其他点的距离列表。然后它循环遍历列表并获得最小值。您应该在distances.Sort()
中使用AddNearestColumn()
而不是手动循环,但我会留给您。 : - )
Public Sub ProcessTable(table As Data.DataTable)
AddNearestColumn(table)
End Sub
Private Sub AddNearestColumn(table As Data.DataTable)
table.Columns.Add("Nearest", GetType(Double))
For Each r As Data.DataRow In table.Rows
Dim distances As List(Of Double) = GetDistancesFromPoint(table, r)
Dim nearest As Double = Double.MaxValue
For Each distance As Double In distances
If (distance < nearest) Then nearest = distance
Next
r.Item("Nearest") = nearest
Next
End Sub
Private Function GetDistancesFromPoint(table As Data.DataTable, referenceRow As Data.DataRow) As List(Of Double)
Dim output As New List(Of Double)
For Each r As Data.DataRow In table.Rows
Dim referenceId As String = CStr(referenceRow.Item("ID"))
Dim rowId As String = CStr(r.Item("ID"))
If (rowId = referenceId) Then Continue For
Dim x1 As Double = Convert.ToDouble(referenceRow.Item("X"))
Dim y1 As Double = Convert.ToDouble(referenceRow.Item("Y"))
Dim x2 As Double = Convert.ToDouble(r.Item("X"))
Dim y2 As Double = Convert.ToDouble(r.Item("Y"))
output.Add(Math.Sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1))))
Next
Return output
End Function