Collections 是否已存在此算法的高阶函数?

Collections 是否已存在此算法的高阶函数?,collections,f#,higher-order-functions,Collections,F#,Higher Order Functions,我提出了一个简单的算法(将元组列表转换为键到列表的映射集合),这是我在F#代码中需要的: 输出: dict [ ("a", [1; 3]), ("b", [2]) ] 我想这一定是BCL或F#的高阶函数集中已经存在的东西,也许?如果是的话,有人能给我介绍一下吗?因为我确信我的代码不是很有效,因为它是…似乎你想得到这样的东西 let toGroupMap x = x |> Seq.groupBy fst |> Seq.map (fun (

我提出了一个简单的算法(将元组列表转换为键到列表的映射集合),这是我在F#代码中需要的:

输出:

dict [ ("a", [1; 3]), ("b", [2]) ]

我想这一定是BCL或F#的高阶函数集中已经存在的东西,也许?如果是的话,有人能给我介绍一下吗?因为我确信我的代码不是很有效,因为它是…

似乎你想得到这样的东西

let toGroupMap x = 
    x
    |> Seq.groupBy fst 
    |> Seq.map 
        (fun (k,v) -> k, v |> Seq.map snd |> Seq.toArray)
    |> Map.ofSeq
金融服务机构:


您可以了解ILookup和IDictionary接口之间的区别

@FoggyFinder:updated所以没有更高阶的函数已经做到了这一点?为什么你的解决方案比我的好?你是说你的算法效率更高吗?在这段代码中,有两件事看起来比你原来的算法更好。首先,
Seq.groupBy
是O(N),而您的是O(N^2),因为它贯穿了每个键的整个
序列。其次,Foggy Finder的代码看起来更加地道。也就是说,作为一名经验丰富的F#编码器,我可以阅读它并立即看到它在做什么。然而,大量使用LINQ的代码更像C,更不透明,我需要花相当长的时间才能看到它的作用。更容易阅读的代码可以更好地理解程序,而从长远来看,这又会导致更少的bug。等等,。ToLookup不正是这样做的吗?
dict [ ("a", [1; 3]), ("b", [2]) ]
let toGroupMap x = 
    x
    |> Seq.groupBy fst 
    |> Seq.map 
        (fun (k,v) -> k, v |> Seq.map snd |> Seq.toArray)
    |> Map.ofSeq
val toGroupMap : x:seq<'a * 'b> -> Map<'a,'b []> when 'a : comparison
val input : (string * int) list = [("a", 1); ("b", 2); ("a", 3)]
val output : Map<string,int []> = map [("a", [|1; 3|]); ("b", [|2|])]
open System.Linq

let output = input.ToLookup(fst, snd)