繁体   English   中英

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

[英]How to Select by LINQ into anonymous type in 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#中工作?

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

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

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

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

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

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

注意使用| 花括号内侧的字符。 这就是现在将常规记录与F#中的匿名记录区分开来的原因。 另请注意,当访问F#中的字符串的第一个字符时. 必须使用方法访问器运算符来访问索引器,就像访问其他方法一样。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM