Набор ключей с карты

У меня есть карта X, и я пытаюсь получить набор ключей, удовлетворяющих определенному условию, примерно так:

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

... но я не могу найти способ получить ключи из коллекции карт F #.

Ответы

Ответ 1

Сначала преобразуйте карту в последовательность кортежей (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

Ответ 2

Для набора ключей вы можете просто сделать:

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

Ответ 3

Наиболее читаемый (и, вероятно, наиболее эффективный, из-за отсутствия необходимости в предыдущих преобразованиях в Seq или отображении) ответ:

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