21

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

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

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

4

3 回答 3

33

首先将您的映射转换为元组序列,(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
于 2013-11-02T17:36:28.650 回答
3

在 F# 6.0 中,Mapcollection 现在有一个Keys属性


旧答案

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

let Keys(map: Map<'K,'V>) =
    seq {
        for KeyValue(key,value) in map do
            yield key
    } |> Set.ofSeq
于 2019-07-22T19:15:44.983 回答
0

对于一组键,您可以这样做:

let keys<'k, 'v when 'k : comparison> (map : Map<'k, 'v>) =
    Map.fold (fun s k _ -> Set.add k s) Set.empty map
于 2018-06-19T10:12:51.623 回答