小ネタです。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;
}
}
}
見た目だけはそれっぽくなったというネタでした。