2017-08-25 37 views
4

好吧,让我迷失在这一张上。我有一个对象列表。每个对象都是一个非唯一的ID。我想对这个ID进行分组,但是对于我的生活,我无法弄清楚如何做到这一点。将列表分组到F#列表中的列表中

这是我

type fooObject = { 
    Id : int 
    Info : string 
} 

let fooObjects: fooObject list 

数据可能是这个样子

[ { Id = 1 ; Data = "foo" } ; { Id = 1 ; Data = "also foo" } ; { Id = 2 ; Data = "Not foo" } ] 

我想是这样

let fooObjectsGroupedById : fooObject list list 

所以最后的结果是这样的

[ [{ Id = 1 ; Data = "foo" } ; { Id = 1 ; Data = "also foo" } ] ; [{ Id = 2 ; Data = "Not foo" }]] 

回答

7

使用List.groupBy

let groupById fooObjects = 
    List.groupBy (fun foo -> foo.Id) fooObjects 
     |> List.map snd 
+0

感谢您的回答。什么是snd? –

+1

'snd'被使用是因为'groupBy'返回一个元组列表,其中第一个元素是分组键(在你的情况下是Id值),第二个元组元素是所有匹配的列表。函数['snd'](https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/operators.snd%5B't1,'t2%5D-function-%5Bfsharp%5D)将第二项来自一个元组 –

+0

真棒谢谢你。 –