2013-03-26 70 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