2013-03-26 57 views
1

我对vb.net相当陌生,经过几个小时的搜索后找不到任何特定的帮助。迭代过程返回第二低值

我有一个三列数据点表,第1列是“点id”,第2列是“x坐标”,第3列是“y坐标”。我需要添加第四列,然后用迭代过程中的第二低值填充此列。

迭代过程是找到从该点到另一个点的距离,返回第二个最低值,因为最低值将是0(到它自己的距离)。点1和点2之间距离的数学式为(((x2-x1)(x2-x1))+((y2-y1)(y2-y1)))。

我正在努力在迭代过程中做一个迭代过程,以重新获得一个单一的值。

任何帮助将非常感谢:)

+0

到目前为止,您是否有任何代码?或无? – 2013-03-28 04:13:13

回答

1

遍历表中的行。然后对于每一行,再次遍历表中的行。但是,当您到达主要迭代目前所在的行时,您可以跳过该行并继续。而且,由于距离是在点对之间的,因此您只需要遍历表中的一半行即可获得所有距离。

如果你发布了一些关于你是如何实现这个功能的更多细节,可以用一些代码来帮助你,但是现在,你甚至都不知道你有什么样的表格或者你的表格程序已经建立,所以很难更具体。

1

这是一个可能的解决方案[未经测试]。 AddNearestColumn()方法循环遍历每一行,并获取到表中其他点的距离列表。然后它遍历列表并获取最小值。您应该在AddNearestColumn()中使用distances.Sort()而不是手动循环,但我会为您保留这一点。 :-)

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

感谢您的回复,我试图把这段代码放到我现有的代码中,但得到错误“类型'System.Data.Datarow'的值不能转换为整数。”我在你的代码中注意到r在任何地方都不是“暗淡”的,这是错误的原因吗? – 2013-03-27 21:18:04

+0

我在记事本中弹出了我的原始答案,并在每个“Item”的末尾错误地放了'.Value'。查看更新的代码。 – nunzabar 2013-03-28 00:44:31

+0

对不起,再次感到痛苦,代码运行良好unil它得到的点“dim x2 as double”我得到一个错误“对象不能从DBNull o其他类型转换”。有任何想法吗? – 2013-03-28 20:54:34