如何访问列表中元组的第一个元素?

时间:2019-12-17 16:04:34

标签: f#

我正在尝试在f#中的类中创建碰撞方法。 碰撞方法应有一个输入,即时间。 该方法应检查随时间推移移动的许多无人机,以及其中一些是否会发生碰撞。冲突定义为彼此相距5个“块”之内。

到目前为止,我已经对该方法使用了这段代码。

type Airspace(drones:Drone list) = 
    let mutable drones = drones
        member x.Drones with get() = drones
    member x.Collision(time:int) =
        for d = 1 to time do 
           for i = 1 to drones.Length do
               for j = 1 to drones.Length do
                   if drones.Item(i).Position.Item1 - drones.Item(j).Position.Item1 >= -5.0 || drones.Item(i).Position.Item1 - drones.Item(j).Position.Item1 <= 5.0 
                   then if drones.Item(i).isFinished() = True && drones.Item(j).isFinished() = True then printfn "Drone: %A will collide with %A" (drones.Item(i)) (drones.Item(j))

顺便说一句,无人机是一列无人驾驶飞机,而无人驾驶飞机的当前位置是元组float float,目的地也是浮点型 float,而速度是浮点型。

我很确定这是错误的

drones.Item(i).Position.Item1

但是我不确定如何访问列表中的第i个元素,然后仅获取元组的第一个元素并将其与另一个元素进行比较。我该怎么办?

1 个答案:

答案 0 :(得分:1)

嗯,这不是100%错误,它可能可以工作,但是是的,建议不要使用ItemX而是对元组元素进行模式匹配,因此您可以这样做:

let (xi, _) = drones.Item(i).Position
let (xj, _) = drones.Item(j).Position
if xi - xj >= -5.0 || xi - xj <= 5.0 

顺便说一句,如果您真的不需要使用索引,还可以将循环更改为:

       for di in drones do
           for dj in drones do
               let (xi, _) = di.Position
               let (xj, _) = dj.Position

还请注意,您可以使用传递到List.allPairs的函数List.tryFind代替for循环。