2011-04-10 5 views
0

다음 코드는 사전 시퀀스에서 발견 된 키 집합을 나열합니다. 각 사전은 기본적으로 데이터베이스의 행입니다.사전 키 시퀀스를 집합으로 변환

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

보다는 그러나 나는 함수에서 반환하고 싶지만 타입 추론에 문제가하고있는 키 집합을 인쇄 (나는 2dB 테이블을 비교할 수 있도록 세트에 키를 변환 할). 다음을 시도했지만 작동하지 않습니다.

내가 목록의 배열 중 하나 이러한 값을 반환하면된다 (보다는 인쇄) 할

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

내가 무슨 말이냐?

답변

3

ildjarn에서 알 수 있듯이 Seq.map를 사용하여 하나의 옵션은 (당신이 당신의 qurestion, 말 세트의 배열을 얻을 수 끝에 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 패턴을 사용하여 사전의 키를 얻을 수 있기 때문에 유형별 주석을 피할 수 있습니다.

let get_keyset tblseq = 
    [| for x in tblseq -> 
     set [ for (KeyValue(k, v)) in x -> k ] |] 
1

사용 Seq.map보다는 Seq.iter :

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