You might want to create a wrapper class to store the original Balloon object, as well as the location and anything else helpful. Here's a "greatly simplified" example where the Balloon is a string, not the Inventor object. Let me know if this makes sense. The function used in the OrderBy can be pretty much whatever you want. I'm not sure how you're evaluating overlap.
Public Class BalloonWrapper
Public Property Balloon As String
Public Property NodeX As Integer
Public Property NodeY As Integer
End Class
Sub Main()
Dim BalloonList As New List(Of BalloonWrapper) From {
New BalloonWrapper With {.Balloon = "Apple", .NodeX = 3, .NodeY = 4},
New BalloonWrapper With {.Balloon = "Orange", .NodeX = 1, .NodeY = 0},
New BalloonWrapper With {.Balloon = "Banana", .NodeX = 2, .NodeY = 8}
}
Dim SortedByNodeX = BalloonList.OrderBy(Function(b) b.NodeX)
For Each item In SortedByNodeX
Logger.Info(item.Balloon & " - " & item.NodeX & "," & item.NodeY)
Next
Logger.Info("")
Dim SortedByNodeY = BalloonList.OrderBy(Function(b) b.NodeY)
For Each item In SortedByNodeY
Logger.Info(item.Balloon & " - " & item.NodeX & "," & item.NodeY)
Next
Logger.Info("")
Dim SortedByBalloon = BalloonList.OrderBy(Function(b) b.Balloon)
For Each item In SortedByBalloon
Logger.Info(item.Balloon & " - " & item.NodeX & "," & item.NodeY)
Next
End Sub