2017-08-25 54 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

真棒謝謝你。 –