2013-03-26 2 views
1

Я довольно новичок в vb.net и не могу найти никакой конкретной помощи после нескольких часов поиска.Итерационный процесс для возврата второго наименьшего значения

У меня есть таблица точек данных с тремя столбцами, столбец 1 - это «точечный идентификатор», столбец 2 - «координата x», а столбец 3 - «координата y». Мне нужно добавить четвертый столбец, а затем заполнить его вторым самым низким значением из итеративного процесса.

Итерационный процесс находит расстояние от этой точки к точке друг друга, возвращая второе наименьшее значение, поскольку самым низким значением будет 0 (расстояние до себя). Математика для расстояния между точками 1 и 2 представляет собой sqrt (((x2-x1) (x2-x1)) + ((y2-y1) (y2-y1))).

Я пытаюсь выполнить итеративный процесс в итеративном процессе, чтобы перенастроить одно значение.

Любая помощь будет apprecited :)

+0

Есть ли у вас какие-либо коды? или ничего? –

ответ

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

Спасибо за ответ, я попытался поместить этот код в свой существующий код, но получим ошибку «Значение типа« System.Data.Datarow »не может быть преобразован в Integer». Я заметил в вашем коде, что r не «тускло» в любом месте, это причина ошибки? –

+0

Я удалил свой оригинальный ответ в Блокноте и ошибочно положил '.Value' в конце каждого' Item'. См. Обновленный код. – nunzabar

+0

Жаль, что снова боль, код работает нормально, и он попадает в точку «dim x2 as double». Я получаю сообщение об ошибке «объект нельзя отбрасывать из DBNull o других типов». Есть идеи? –

Смежные вопросы