小ネタです。PerlとかJavaScriptとか(まあJavaScriptはC#の new {...} なんだけど)みたいに以下のような感じでDictionaryを初期化できないカナーと思ったわけです。

my %hash = ( Foo => "bar", Baz => "Hoge" );

まあ普通に考えてC# 3.0では次のコードみたいにはできるようになったので結構よい感じなのです。

var hash = new Dictionary<String, String>() { {"Foo", "Bar"}, {"Baz", "Hoge"} };

で、なんかもっとそれらしくできないかなーと思っていたのですが、ふとExpressionとラムダで何とかできたりして?と思い試してみたのが以下のコードです。Dictionary メソッドに複数個のラムダ式を渡して、そのパラメータ名と戻り値を使おうという試みです。

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Diagnostics;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var dict = Dictionary(
                x      => "foo",
                y      => "bar",
                Hauhau => "gaogao"
            );
            
            var dict2 = new Dictionary<String, String>()
            {
                {"x", "foo"},
                {"y", "bar"},
                {"Hauhau", "gaogao"}
            };
            Debug.Assert(dict["x"] == dict2["x"]);
        }
        static Dictionary<String, String> Dictionary(params Expression<Func<Object, String>>[] exprs)
        {
            return CreateDictionaryFromExpression<String>(exprs);
        }
        
        static Dictionary<String, T> CreateDictionaryFromExpression<T>(params Expression<Func<Object, T>>[] exprs)
        {
            Dictionary<String, T> dict = new Dictionary<string,T>();
            foreach (Expression<Func<Object, T>> expr in exprs)
            {
                dict[expr.Parameters[0].Name] = expr.Compile().Invoke(null);
            }
            return dict;
        }
    }
}

見た目だけはそれっぽくなったというネタでした。