かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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