下面是一个相当简单的解决方案:
let groups =
playersScore
|> List.collect (fun (players, game) -> players |> List.map (fun player -> player, game))
|> List.groupBy (fun (player, _) -> player)
|> Map.ofList
|> Map.map (fun _ games -> games |> List.map snd)
将列表分解成一个平面结构,按玩家分组,然后转换成一个以玩家为键的地图,最后映射值,得到游戏的名称。这将生成以下映射:
map
[("Player 1", ["First Game"; "Last Game"]);
("Player 2", ["First Game"; "Second Game"; "Last Game"]);
("Player 3", ["Second Game"; "Third Game"; "Last Game"]);
("Player 4", ["Second Game"; "Last Game"])]
编辑
要将事物作为列表保存,只需使用
List.map
而不是
Map.ofList
和
Map.map
:
let groups =
playersScore
|> List.collect (fun (players, game) -> players |> List.map (fun player -> player, game))
|> List.groupBy (fun (player, _) -> player)
|> List.map (fun (player, games) -> player, games |> List.map snd)
这将以列表形式返回等效结果:
[("Player 1", ["First Game"; "Last Game"]);
("Player 2", ["First Game"; "Second Game"; "Last Game"]);
("Player 3", ["Second Game"; "Third Game"; "Last Game"]);
("Player 4", ["Second Game"; "Last Game"])]