Linq 在F中将一个对象映射/转换为另一个对象

Linq 在F中将一个对象映射/转换为另一个对象,linq,f#,Linq,F#,我是F的初学者,一直玩到遇到这个问题。我找过了,但什么也没找到。我想把一个物体变成另一个。我有很多属性的地理定位对象,其中两个是纬度和经度。我想创建一个新的动态对象,但使用管道或选择操作符,仅使用该属性子集 let customLocation = OtherPlace.Geolocation .... 我怎样才能做到这一点呢?假设您有一个OtherPlace.Geolocation数组 geoLocations : OtherPlace.Geolocation array 然后,您可以根

我是F的初学者,一直玩到遇到这个问题。我找过了,但什么也没找到。我想把一个物体变成另一个。我有很多属性的地理定位对象,其中两个是纬度和经度。我想创建一个新的动态对象,但使用管道或选择操作符,仅使用该属性子集

let customLocation = OtherPlace.Geolocation ....

我怎样才能做到这一点呢?

假设您有一个OtherPlace.Geolocation数组

geoLocations :  OtherPlace.Geolocation array
然后,您可以根据需要:

使用一个元组,它只是记录的一个特例

创建记录类型nb:元组只是一个具有位置名称的记录

对于较小的本地需求,元组更适合,但可能会变得笨拙

记录允许您更好地组织程序

应该使用Union case来区分仍然代表一些共同概念的不同事物。 例如,您可以在不同的系统中表达位置

type GeoPosition = | LaTLong of double * double
                   | WGS84 of double * double
                   | ...

//of type GeoPosition array
let g = geoLocations |> Array.map (fun x -> LatLong (x.Latitude, x.Longitude))  

注:如果您使用F3.1,那么您还有一个额外的方法来命名联合类型字段,如图所示

解决这类问题的最佳方法是创建一个区分大小写的联合。可以使用直接类型别名,但会丢失少量类型安全性。要定义类型,请使用:

type Loc = |LL of float * float
然后,您可以使用以下内容创建实例:

Something |> fun t -> LL(t.Latitude,t.Longitude)
或更简单的版本:

LL(something.Latitude,something.Longitude)

输入Loc=| LL of float*float?谢谢,但是我如何才能从我的对象到新对象创建一个管道?Something |>fun t->LLt.纬度,t.经度?很好的解释,我将使用记录。
Something |> fun t -> LL(t.Latitude,t.Longitude)
LL(something.Latitude,something.Longitude)