kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Dictionaryリテラルっぽい何か

(中略)
        static void Main(string[] args)
        {
            var dict = Dict.Create(
                (out string key, out int val) => { key = "hoge"; val = 0; },
                (out string key, out int val) => { key = "piyo"; val = 10; });
            foreach (var p in dict)
            {
                Console.WriteLine(p.ToString());
            }
        }
(中略)

これは・・・ないな。

KeyValue リテラルが欲しい!

http://d.hatena.ne.jp/bleis-tift/20090626/1246002896

C#はほとんど触ったことが無いのですが、もうちょっとDictionaryリテラルっぽくできるのではないかと思い、Genericな型に対する拡張メソッドを使ってちょっと書いてみました。Javaのstatic import相当があれば、もうちょっと綺麗な見た目にできるなあと思いました。

using System;
using System.Collections.Generic;

namespace Dict
{
    public class KeyValue<K, V> {
      public K Key { get; private set; }
      public V Value { get; private set; }
      public KeyValue(K k, V v) {
        Key = k;
        Value = v;
      }
    }
    public static class Dict
    {
        public static KeyValue<K, V> X<K, V>(this K k, V v) 
        {
            return new KeyValue<K, V>(k, v);
        }
        public static Dictionary<K, V> Create<K, V>(params KeyValue<K, V>[] kvs)
        {
            var result = new Dictionary<K, V>();
            foreach (var kv in kvs)
            {
                result[kv.Key] = kv.Value;
            }
            return result;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var dict = Dict.Create(
                "hoge".X(0),
                "piyo".X(10)
            );
            foreach (var p in dict)
            {
                Console.WriteLine(p.ToString());
            }
        }
    }
}