套从地图的钥匙

时间:2013-11-02 17:27:29

标签: f#

我有一张地图X,我正在尝试获得满足某种条件的一组键,如下所示:

Map.Keys X
|> Set.filter (fun x -> ...)

...但我找不到从F#的Map集合中获取密钥的方法。

3 个答案:

答案 0 :(得分:30)

首先将map转换为元组序列(key,value),然后将其映射到一系列只是键:

map |> Map.toSeq |> Seq.map fst

FSI样本:

>Map.ofList[(1,"a");(2,"b")] |> Map.toSeq |> Seq.map fst;;
val it : seq<int> = seq [1; 2]

或者,由于键的排序可能无关紧要,您可以使用更加热切的方法返回所有键的list。将它变成keys模块的扩展方法Microsoft.FSharp.Collections.Map并不难:

module Map =
    let keys (m: Map<'Key, 'T>) =
        Map.fold (fun keys key _ -> key::keys) [] m

答案 1 :(得分:2)

对于一组你可以做的按键:

let keys<'k, 'v when 'k : comparison> (map : Map<'k, 'v>) =
    Map.fold (fun s k _ -> Set.add k s) Set.empty map

答案 2 :(得分:0)

最易读的(并且可能是最有效的,因为不需要先前对Seq的转换或映射)

let Keys(map: Map<'K,'V>) =
    seq {
        for KeyValue(key,value) in map do
            yield key
    } |> Set.ofSeq