2

特定のクラスのリストがあります。このリストには、ポジションクラスが含まれています。そして、その位置クラスにはX座標とY座標が含まれます。現在の座標とリスト内の座標があります。リスト内の各アイテムの距離を計算して、距離が最小のアイテムを見つけたいと思います。これが私のコードです:

  For Each item As ITEMX In xHandle.ItemList

        Dim CurrX As Integer = txt_TrainX.Text
        Dim CurrY As Integer = txt_TrainY.Text
        Dim NextX As Integer = item.Position.x
        Dim NextY As Integer = item.Position.y

        Dim distance As Integer = DistanceBetween(CurrX, CurrY, NextX, NextY)


    Next

つまり、距離は私の座標とアイテムの間の距離です。リスト内のアイテムごとに計算しますが、最小のものを見つけるにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

3

VB.NETでのLinqの使用:

Dim CurrX As Integer = txt_TrainX.Text
Dim CurrY As Integer = txt_TrainY.Text

Dim NearestITEM = xHandle.ItemList.Min (Function(i) DistanceBetween(CurrX, CurrY, i.Position.x, i.Position.y));

VB.NETのLinqに関する情報とサンプルについては、 http: //msdn.microsoft.com/en-us/vbasic/bb688088を参照してください。

于 2011-07-30T12:43:59.720 に答える
1

最小値の変数を作成し、ループ内の各値と照合します。

ループの外側のコントロールからテキストを解析する必要があります。ループの内側で何度もそれを行うのは無駄です。また、暗黙的であってはならない暗黙的な変換を行わないように、厳密モードをオンにする必要があります。

Dim minimal As Nullable(Of Integer) = Nothing

Dim CurrX As Integer = Int32.Parse(txt_TrainX.Text)
Dim CurrY As Integer = Int32.Parse(txt_TrainY.Text)

For Each item As ITEMX In xHandle.ItemList

  Dim NextX As Integer = item.Position.x
  Dim NextY As Integer = item.Position.y

  Dim distance As Integer = DistanceBetween(CurrX, CurrY, NextX, NextY)

  If Not minimal.HasValue or distance < minimal.Value Then
    minimal.Value = distance
  End If

Next
于 2011-07-30T12:46:55.257 に答える
1

@YahiaのLINQ回答に基づいて、アイテムとアイテムの距離の両方を取得します。

Dim CurrX = CInt(txt_TrainX.Text)
Dim CurrY = CInt(txt_TrainY.Text)

Dim itemsWithDistance = (From item in xHandle.ItemList
                         Select New With {.Item = item, 
                                          .Distance = DistanceBetween(CurrX, CurrY, item.Position.x, item.Position.y)}).ToList()

' At this point you have a list of an anonymous type that includes the original items (`.Item`) and their distances (`.Distance`).
' To get the one with the smallest distance you can do.
Dim nearestItem = itemsWithDistance.Min(Function(i) i.Distance)

' Then to see what that distance was, you can
Console.WriteLine(nearestItem.Distance) 

' or you can access nearestItem.Item to get at the source item.
于 2011-07-30T17:36:18.477 に答える