Преобразовать последовательность ключей словаря в набор - PullRequest
1 голос
/ 11 апреля 2011

Следующий код перечисляет набор ключей, найденных в словарной последовательности (каждый из них в основном является строкой из базы данных). (Я хочу преобразовать ключи в набор, чтобы я мог сравнить таблицы 2 дБ)

for seqitem in tblseq do
    let keyset = seqitem.Keys |> Set.ofSeq    // works correctly
    printfn ">>> List: %A; Item Type: %A" keyset

Вместо того, чтобы печатать набор ключей, я хочу вернуть его из функции, но у меня проблема с выводом типа. Пробовал следующее, но это не работает;

Что я хочу сделать, это вернуть эти значения в виде массива списка (вместо того, чтобы печатать их)

let get_keyset tblseq = 
                tblseq |> Seq.iter (fun x ->  
                       x.Keys |> Set.ofSeq                   
                     ) 

Что мне здесь не хватает?

Ответы [ 2 ]

4 голосов
/ 11 апреля 2011

Использование Seq.map, как предлагает ildjarn, является одним из вариантов (вы можете добавить Array.ofSeq в конец, чтобы получить массив множеств, как вы говорите в своей инструкции).

Альтернативный подход - использовать понимание массива:

let get_keyset (tblseq:seq<System.Collections.Generic.Dictionary<_, _>>) = 
    [| for x in tblseq -> x.Keys |> Set.ofSeq |]

Обозначение [| .. |] говорит о том, что вы хотите создать массив элементов, а выражение, следующее за ->, указывает, что должно быть создано как элемент. Синтаксис, по сути, просто более хороший способ написания Seq.map (хотя он поддерживает больше функций).

Вы также можете использовать этот синтаксис для создания множеств (вместо вызова Set.ofSeq). В этом случае это не имеет особого смысла, потому что Set.ofSeq быстрее и быстрее, но иногда это довольно аккуратный вариант. Это позволяет вам избегать аннотаций типов, потому что вы можете получить ключ словаря, используя KeyValue pattern:

let get_keyset tblseq = 
    [| for x in tblseq ->
         set [ for (KeyValue(k, v)) in x -> k ] |]
1 голос
/ 11 апреля 2011

Используйте Seq.map вместо Seq.iter:

let get_keyset tblseq =
    tblseq
    |> Seq.map (fun (x:Dictionary<_,_>) -> x.Keys |> set)
    |> Array.ofSeq
...