繁体   English   中英

F#-GroupBy并将功能应用于第二个元组项内的每个属性

[英]F# - GroupBy and apply function to each property inside second tuple item

我有一个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的序列。 MyClass中其余的每个属性都需要具有不同的功能。 在过去总结一个属性,我刚刚做了类似的事情:

|> 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#列表理解)和caculate 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 ])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM