作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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?
|> Seq.map (fun (a, b) -> (a, b |> Seq.SumBy (fun x -> x.myProperty)))
最佳答案
您需要以某种方式指定要使用的属性 - 最简单的方法是创建读取属性的函数列表。假设您的类型是 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/
我是一名优秀的程序员,十分优秀!