从列表映射到另一种类型-有没有更好的方法来做到这一点?

f#

let claimsList  =  
          [ {|cType = "uid"; cValue="1"|};
            {|cType = "name"; cValue="N1"|}; 
            {|cType = "sid"; cValue="sid1"|}; 
            {|cType = "email"; cValue="email@N1.com"|}; 
            {|cType = "company"; cValue="Company1"|}]

let email = claimsList
          |> List.tryFind(fun c -> c.cType = "email")
          |> Option.map(fun c -> c.cValue)
let company = claimsList
            |> List.tryFind(fun c -> c.cType = "company")
            |> Option.map(fun c -> c.cValue)
let userId = claimsList
           |> List.tryFind(fun c -> c.cType = "userId")
           |> Option.map(fun c -> c.cValue)

(email, userId, company)

我不喜欢我多次迭代列表并且看起来很复杂的事实。有没有办法简化这个?

回答

如果您需要多次查找声明,并且假设它们都有不同的cTypes,则可以将列表转换为地图,然后在其中查找:

let map = claimsList |> List.map (fun r -> r.cType, r.cValue) |> Map.ofList

let email = map.["email"]
let company = map.["company"]
let userId = map.["uid"]

请注意,map.["email"]如果映射中不存在键,则索引类似将在运行时崩溃。如果丢失的键“通常不应该发生”,这很好,但是如果您想优雅地处理这种情况,请Map.tryFind改用,它将返回一个option

let email = map |> Map.tryFind "email"


以上是从列表映射到另一种类型-有没有更好的方法来做到这一点?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>