c# - F# 按多个值分组并聚合
问题描述
F#。我有transactions
以下类型的列表:
type Transaction(Debitor: string, Spend:float, Creditor:string) =
member this.Debitor = Debitor
member this.Spend = Spend
member this.Creditor = Creditor
我知道如何按一个值分组。比如说我想对每个属性进行分组Debitor
,很容易将该属性用作组的键:
let tsGroupDebitor =
transactions
|> Seq.groupBy(fun ts -> ts.Debitor)
但是,我无法按两个值进行分组,比如Debitor
和Creditor
。理想情况下,我想分组考虑Debitor
AND Creditor
,同时为属性应用聚合函数“Sum” Spend
。
换句话说,我想实现以下 LINQ 查询的 F# 等效项:
var transactions_GroupSameDebitorCreditor =
transactions
.GroupBy(ts => new { ts.Debitor, ts.Creditor }) // group by multiple values
.Select(gr => new
{
Debitor = gr.Key.Debitor,
Debit = gr.Sum(trans => trans.Spend), //sum the trans values per grouped relationships
Creditor = gr.Key.Creditor
});
返回匿名类型的 IEnumerable 的位置。
解决方案
您可以使用元组作为组键,如下所示:
let tsGroupDebitor =
transactions
|> Seq.groupBy(fun ts -> (ts.Debitor, ts.Creditor))
如果要聚合每个组的事务以汇总 Spend 属性,可以这样做:
let tsGroupDebitor =
transactions
|> Seq.groupBy(fun ts -> (ts.Debitor, ts.Creditor))
|> Seq.map(fun ((debitor, creditor), values) -> ( debitor, creditor, values |> Seq.sumBy (fun t -> t.Spend)))
请注意我如何使用模式匹配模式((debitor, creditor), values)
来访问组键的两个部分以及每个组的事务序列 ( values
)
推荐阅读
- python - 覆盖 libc open() 导致 python os.popen().read() 挂起
- couchdb - 从 CouchDB 数据库中清除所有非当前数据的推荐过程是什么?
- angular - 描述中定义的变量在角度测试的外部函数中是“未定义的”(jest/jasmine)
- android - Stripe Android - 为错误消息设置区域设置
- php - 使用 curl 和 crontab 执行 api 请求而不是正常工作
- python - 如何在 boto3 中使用 send_raw_email 指定回复?
- ruby-on-rails - Rails::TestUnitReporter 找不到 MiniTest::Result 测试的方法
- python-3.x - 生成二进制编码符号 Python 程序
- sql-server - 为其他用户禁用 SQL Server 登录弹出窗口
- r - 创建具有时间戳增量的数据框行