2013-11-02 4 views
14

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

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

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

ответ

22

Преобразование 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 
+0

Результат должен быть набор не список –

+0

@ GuillaumeMassé: Автор, видимо, были проблемы только с»... способ получить ключи от коллекции карты F # », поэтому ответ был адресован именно этому вопросу. –

+0

не будут ли эти методы немного неэффективными ??? – ympostor

Смежные вопросы