在F#中将一个列表分组为一个列表的列表

4

好的,这个有点让我摸不着头脑。我有一个对象列表,每个对象里都有一个非唯一的ID。我想按照这个ID来分组,但是我真的想不出该怎么做。

这是我的代码:

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" }]]
1个回答

7
使用 List.groupBy
let groupById fooObjects =
    List.groupBy (fun foo -> foo.Id) fooObjects
        |> List.map snd

谢谢你的回答。snd 是什么? - DotNetRussell
1
使用snd是因为groupBy返回一个元组列表,其中第一项是分组键(在您的情况下是Id值),第二个元组项是所有匹配项的列表。函数snd从元组中提取第二个项。 - Chad Gilbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接