T 型の配列から Dictionary へ変換する
元ネタ:かずきの Blog@Hatena
- stringの配列からDictionary<string, string>への変換
- stringの配列からDictionary<string, string>への変換 その2
- stringの配列からDictionary<string, string>への変換 その3
久々にプログラム小ネタです。
# しかし、その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