2017-10-09 10 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を使うことができます。コード行は似ていますが、より機能的な方法です。

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

編集

TheQuickBrownFoxはコメントで指摘したように、辞書機能は、読み取り専用の辞書を生成します。

+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)