Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# Seq.sumBy vs Seq.groupBy_F#_Pipeline - Fatal编程技术网

F# Seq.sumBy vs Seq.groupBy

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)

为了练习,我正在尝试将一些C代码转换成F代码。 在这样做的时候,我偶然发现了一个职位计算。逻辑是按交易对手和证券进行分组,并对名义金额进行代数求和,以计算头寸

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
模块。