かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

stringの配列からDictionaryへの変換 まとめ

4回にわたって小ネタを書いてきました!!!

id:masa-kさんのブログでも取り上げてもらえました。

個人的にも、今回はToDictionaryというT[]を受けてDictionaryを返すメソッドを作って内部ではループ回してやるかな〜と思います。LINQでやってみたのは頭の体操と、ループ回すよりもっといい書き方があるかな?という探究心からです。実用性を狙ったものではありません。
id:masa-kさんの記事にあるようにPerl5みたいな機能があれば自作しなくていいので一番いいなぁと思いました。標準ライブラリがどれだけ充実してライトに処理が書けるかというのは個人的には、とても大事なポイントです。
.NET系言語は、BCLが割とかゆい所まで手が届くので満足してるのですが、たまにLL系の言語羨ましいな〜と思うときがあります。その点F#には地味に期待してたりします。

因みにF#では要素数が2つのタプルのシーケンスからIDictionaryに変換してくれるdictという関数があるので配列からタプルの配列にしてやる処理さえ書けばOKです。

let array = ["1"; "one"; "2"; "two"; "3"; "three"]

let rec toPair (s : list<'T>) =
    seq {
        match s with
        | fst::snd::[] -> yield fst, snd
        | fst::snd::tail -> yield fst, snd; yield! toPair tail
        | fst::[] -> yield fst, null
        | _ -> failwith "NG"
    }

// 'T list -> seq<'T * 'T> -> IDictionary<'T, 'T> 
let d = array |> toPair |> dict
printfn "%A" d // こう表示される seq [[1, one]; [2, two]; [3, three]]

さて、ここで新たなる課題が。このtoPair関数を末尾再帰にしたいけどやりかたが・・・orz