gpt4 book ai didi

map - F# - GroupBy 并将函数应用于第二个元组项中的每个属性

转载 作者:行者123 更新时间:2023-12-04 22:33:13 26 4
gpt4 key购买 nike

我有一个 F# 类列表,我正在使用属性访问这些类的数据(我使用的是用 C# 开发的库)。我想按一个属性分组,然后对结果元组的第二项中的每个属性应用一个单独的函数。

例子:

let grouped = list  |> Seq.groupBy (fun x -> x.Year) //group by the year property. Results in Seq<int * seq<myClass>>
|> Seq.map (fun (a, b) -> (a, //How to map generic functions to each remaining property in the second tuple?

希望这对某人有意义。我的第二个元组项是由 groupBy 产生的 seq。 MyClass 中的每个剩余属性都需要应用不同的函数。在过去总结一个属性(property)我刚刚做了类似的事情:
|> Seq.map (fun (a, b) -> (a, b |> Seq.SumBy (fun x -> x.myProperty)))

我想对几个属性使用 Seq.map 做这样的事情。

非常感谢您的帮助,
理查德

最佳答案

您需要以某种方式指定要使用的属性 - 最简单的方法是创建读取属性的函数列表。假设您的类型是 MyType ,你可以这样写:

let properties = [ (fun (x:MyType) -> x.MyProperty) ]

构造组后,您可以遍历 properties 中的所有属性。 (使用 List.map 或 F# 列表推导式)并计算 values |> Seq.sumBy prop哪里 values是群和 prop是当前属性:
let grouped = 
list
|> Seq.groupBy (fun x -> x.Year)
|> Seq.map (fun (key, values) ->
(key, [for prop in properties -> values |> Seq.sumBy prop ])

如果您需要使用除 Seq.sumBy 以外的其他聚合函数,然后您可以构建需要运行的聚合操作列表(而不是属性列表)。
let properties = [ "MyPropSum", Seq.sumBy (fun (x:MyType) -> x.MyProperty);
"MyProp2Avg", Seq.averageBy (fun (x:MyType) -> x.MyProperty2) ]

为了使进一步处理更容易,我可能会用结果构建一个字典 - 这可以通过将带有名称-值对的列表传递给 dict 来轻松完成。功能:
let grouped = 
list
|> Seq.groupBy (fun x -> x.Year)
|> Seq.map (fun (key, values) ->
(key, dict [for name, aggregate in properties -> name, aggregate values ])

关于map - F# - GroupBy 并将函数应用于第二个元组项中的每个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15340635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com