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

标签 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)
我不喜欢我多次迭代列表并且看起来很复杂的事实。有没有办法简化这个?

最佳答案

如果您需要多次查找 claim ,并且它们都有不同的 cType s,您可以将列表转换为 map ,然后在其中查找:

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 中,将在运行时崩溃。如果丢失的键“通常不应该发生”,这很好,但是如果您想优雅地处理这种情况,请使用 Map.tryFind相反,它会返回一个 option :
let email = map |> Map.tryFind "email"

关于f# - 从列表映射到另一种类型 - 有没有更好的方法来做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67130872/

相关文章:

F# Excel 互操作 : Marshal. GetActiveObject ("Excel.Application") 不起作用

generics - F# 中的严格泛型枚举转换

visual-studio - 使用取消引用库和 Visual Studio 2015 运行 xunit 测试时出错 - 找不到方法

f# - NuGet 更新用户界面是否有效?

reflection - 我将如何发出受歧视的联盟?

f# - 将 .net-Core F# 文件添加到 vscode 中的 F# 项目

.net - 为什么我在 F# 中的并行性能很差

loops - 使用 for 循环将元素添加到 F# 中的 Map

visual-studio - f# 编译太慢

types - F# 奇怪的类型错误消息