2017-10-09 1 views
1

F #에서 사전에 대한 생성자가 있습니까 (Seq/List를 입력으로 사용하고 사전을 출력합니까)? 나는 내가 원하는 것을 다음 코드를 작성했습니다,하지만 난 어쩌면 이미 구현되어 단지 호기심 (그래서 내가 직접 구현할 필요가 없습니다) 내가 아는F # 사전 작성자 목록/Seq

let DictionaryBuilder (keyFunc:'a->'b) (valueFunc:'a->'c) aList = 
    let dict = new Dictionary<'b,'c>() 
    aList 
    |> Seq.iter (fun a -> dict.Add(keyFunc a, valueFunc a)) 
    dict // return 

C#으로, 당신이 할 수있는 그 .ToDictionary (System.Linq 사용)

// using System.Collections.Generic; 
// using System.Linq; 
List<string> example = new List<string> {"a","b","c"}; 
Dictionary<string,string> output = example.ToDictionary(x => x+"Key", x => x+"Value"); 
// Output: {"aKey": "aValue", "bKey": "bValue", "cKey": "cValue"} 

고맙습니다.

답변

1

그것뿐만 년대 딕셔너리 함수의 서명은 다음과

dict : seq<'Key * 'Value> -> IDictionary<'Key,'Value> 

그래서 입력으로 키 값 시퀀스 걸린다. 핵심은 키 값 시퀀스를 제공하는 것입니다. 귀하의 경우 iter 대신 map을 사용할 수 있습니다. 코드 줄은 비슷하지만 더 기능적인 방식입니다. TheQuickBrownFox으로 편집

aList 
|> Seq.map (fun a -> keyFunc a, valueFunc a) 
|> dict 

이 코멘트에서 언급 한의 DICT 함수는 읽기 전용 사전을 생성합니다.

+0

'dict'은 읽기 전용 사전을 생성합니다 (항목을 추가하거나 제거하려고하면 예외가 발생합니다). 사전을 다시 Dictionary 생성자에 전달하여이 문제를 해결할 수 있습니다 :'... |> dict |> System.Collections.Generic.Dictionary' – TheQuickBrownFox

+0

감사합니다. –

1

난 그냥 LINQ를 사용하는 것이 좋습니다 것입니다 :

open System.Linq 
[1; 2; 3].ToDictionary(id, (*) 2) 

를 직접 사용하거나 오히려 확장 메서드보다 기능을 사용하려는 경우 귀하의 도우미 함수에서 사용 하나.

module Seq = 
    open System.Linq 
    let toDictionary (f:'s -> 'k) (g:'s -> 'v) (xs:_ seq) = xs.ToDictionary(f, g)