F# Seq.sumBy vs Seq.groupBy
为了练习,我正在尝试将一些C代码转换成F代码。 在这样做的时候,我偶然发现了一个职位计算。逻辑是按交易对手和证券进行分组,并对名义金额进行代数求和,以计算头寸F# Seq.sumBy vs Seq.groupBy,f#,pipeline,F#,Pipeline,为了练习,我正在尝试将一些C代码转换成F代码。 在这样做的时候,我偶然发现了一个职位计算。逻辑是按交易对手和证券进行分组,并对名义金额进行代数求和,以计算头寸 let position instance = portfolio |> Seq.filter (isActive instance) |> Seq.groupBy (fun trade -> trade.Counterparty, trade.Bond)
let position instance =
portfolio
|> Seq.filter (isActive instance)
|> Seq.groupBy (fun trade -> trade.Counterparty, trade.Bond)
|> Seq.map (fun ((cp, bond), trades) -> cp, bond.Isin, trades |> Seq.sumBy (fun t -> t.Nominal))
上面的管道产生了预期的结果,但感觉可以简化一点。
这就是我在C#中所做的,过滤、分组,然后通过使用匿名类型或创建DTO并使用它来投影它
交易对手
债券
位置
A.
FR100
100
A.
德100
-100
B
FR100
200
C
德100
100
我觉得不错。除了过滤器、组和项目之外,我看不到一种简化的方法。这些似乎都是基本的。FWIW,C#中的LINQ与F#中的
Seq
模块非常相似,因为两者都是纯函数方法,所以它们之间通常是直接的1:1转换。不过,F#通常需要更少的按键。欢迎来到F#社区!我看不出有什么办法可以大大简化这一点。如果portfolio
实际上是一个数组,然后考虑使用<代码>数组>代码>模块,而不是<代码> SEQ 模块。如果代码产生预期的结果,那么问题更适合于@代码的用法>代码> SEQ 在长的转换中比使用<代码>数组或<代码>列表< /代码>的性能总体上更好,因为我们不这样做。每次操作后具体化整个集合。@JL0PD我希望看到一篇文章,解释应该使用Array
模块还是Seq
模块以及何时使用Array
模块。