如何通过LINQ选择F#中的匿名类型

时间:2015-08-09 21:58:38

标签: .net linq f#

我有这段代码片段,它创建了一个匿名类型元素数组,其中包含Name和FirstLetter属性:

string[] arr = { "Dennis", "Leo", "Paul" };

var myRes = arr.Select(a => new { Name = a, FirstLetter = a[0] });

我想在F#中做同样的事情。我试过了:

let names = [| "Dennis"; "Leo"; "Paul" |]

let myRes = names.Select(fun a -> {Name = a; FirstLetter = a[0]} )

但这并没有编译。它说:

唱片公司名称'未定义。

如何让这条线在F#中工作?

3 个答案:

答案 0 :(得分:6)

与评论一样,F#不支持匿名类型。因此,如果您想将序列投影到另一个序列中,请创建一个记录,它实际上是一个带有命名字段的元组。

type p = { 
  Name:string;
  FirstLetter: char 
}

let names = [| "Dennis"; "Leo"; "Paul" |]
let myRes = names.Select(fun a -> {Name = a; FirstLetter = a.[0]} )   

答案 1 :(得分:1)

从F#4.6开始,您的初始尝试将更加直观。使用 .NET Core SDK 3.0.100-preview4 测试了类似的示例,我能够使用新的Anonymous Record功能来证明这一点。

let names = [| "Dennis"; "Leo"; "Paul" |]

let myRes = names.Select(fun a -> {| Name = a; FirstLetter = a.[0] |})

请注意在花括号内部使用|字符。这就是现在将常规记录与F#中的匿名记录区分开的地方。还要注意,在F#中访问字符串的第一个字符时,必须像访问其他方法一样使用. method accessor operator来访问索引器。

答案 2 :(得分:0)

let names = [| "Dennis"; "Leo"; "Paul" |]
let myRes = names.Select(fun a -> a, a.[0])
for r in myRes do
    let name, firstletter = r
    printfn "%A, %A" name firstletter