雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

T 型の配列から Dictionary へ変換する

元ネタ:かずきの Blog@Hatena

久々にプログラム小ネタです。
# しかし、その3の方法は思いつかなかったなぁ。。。
# さすが neue さん。
それ Perl なら (ry *1と云うのは置いといて(w
TMTOWTDI って事でなんとなく拡張メソッドを使ってやってみました。
# 無意味に Rx 使ってますが気にしないでやってください。

class sample
{
  static void Main()
  {
    var arr = new [] {"1", "one", "2", "two"};
    var dict = arr.ToDictionary();
  }
}

public static class ArrayExtensions
{
  // .NET 標準の ToDictionary 拡張メソッドとはかなり違いますが。。。
  public static Dictionary<T, T> ToDictionary<T>(this IList<T> arr)
  {
    var dict = new Dictionary<T, T>();
    arr.ToKeyValuePair()
       .ToObservable()
       .Subscribe(kv => dict.Add(kv.Key, kv.Value));
    return dict;
  }

  public static IEnumerable<KeyValuePair<T, T>> ToKeyValuePair<T>(this IList<T> arr)
  {
    for (var i = 0; i < arr.Count; i += 2)
    {
      yield return new KeyValuePair<T, T>(arr[i], arr[i + 1]);
    }
  }
}

拡張メソッドを Generic で書いているので、元の配列の要素の型は色々使いまわせます。(必要あるのか判らないけどw)
# ちなみに、 ToDictionary() 拡張メソッドの ToObservable().Subscribe() を foreach で書けば Rx 要りません。 :p
(おまけ)

「古き良き?やり方」と書かれていますが、今回のケース位ならこれでも十分かと。
# どうせ LINQ 使っても中ではぐるぐるまわしているんだし。 :p

*1:Perl5 の場合、 @arr = ("1", "one", "2", "two"); であれば %dict = @arr; でおしまいw