F#管道操作符如何实现类似C# LINQ let子句的临时变量功能
完全可以,F#提供了两种常用实现方式,和C# LINQ的let使用体验一致。
方案1:使用F#查询表达式(语法和C# LINQ完全对齐)
F#原生的查询表达式支持let子句,逻辑和C# LINQ写法几乎一模一样:
let users2 = query { for user in users do let total = users |> List.sumBy (fun u -> u.Salary) let avg = total / n where (user.Salary > avg) select user }
你也可以直接用平均函数简化计算,不需要手动求和再除以数量:
let users2 = query { for user in users do let avg = users |> List.averageBy (fun u -> float u.Salary) where (user.Salary > int avg) select user }
方案2:使用嵌套let绑定(不需要查询表达式)
F#的let绑定支持嵌套在表达式内,你不需要拆分出两个独立的顶级变量,直接在同一个赋值逻辑里完成即可,性能和拆分写法完全一致:
let users2 = let avg = users |> List.averageBy (fun user -> float user.Salary) users |> List.filter (fun user -> user.Salary > int avg)
以上两种写法的临时变量都只会计算一次,不会在遍历用户的过程中重复执行计算,和你之前分两步实现的版本性能完全相同。
内容的提问来源于stack exchange,提问作者Jan Bodnar
相关产品推荐
相关产品推荐

