views:

1963

answers:

4

I've been doing c# for a long time, and have never come across an easy way to just new up a hash.

I've recently become acquainted with the ruby syntax of hashes and wonder, does anyone know of a simple way to declare a hash as a literal, without doing all the add calls.

{ "whatever" => {i => 1}; "and then something else" => {j => 2}};
+16  A: 

If you're using C# 3.0 (.NET 3.5) then you can use collection initializers. They're not quite as terse as in Ruby but still an improvement.

This example is based on the MSDN Example

var students = new Dictionary<int, StudentName>()
{
    { 111, new StudentName {FirstName="Sachin", LastName="Karnik", ID=211}},
    { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317, }},
    { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198, }}
};
Wheelie
BTW: VisualStudio/ReSharper tells me, that the parentheses in new Dictionary<int, StudentName>() are optional and redundant. Saves two characters ;)
Daren Thomas
+1  A: 

There may be a syntax to do this in the upcoming version of C# but at the moment, no such thing exists. However, you might want to look at the Enumerable.ToDictionary method in combination with Linq queries.

Konrad Rudolph
+6  A: 

When I'm not able to use C# 3.0, I use a helper function that translates a set of parameters into a dictionary.

public IDictionary<KeyType, ValueType> Dict<KeyType, ValueType>(params object[] data)
{
    Dictionary<KeyType, ValueType> dict = new Dictionary<KeyType, ValueType>((data == null ? 0 :data.Length / 2));
    if (data == null || data.Length == 0) return dict;

    KeyType key = default(KeyType);
    ValueType value = default(ValueType);

    for (int i = 0; i < data.Length; i++)
    {
        if (i % 2 == 0)
            key = (KeyType) data[i];
        else
        {
            value = (ValueType) data[i];
            dict.Add(key, value);
        }
    }

    return dict;
}

Use like this:

IDictionary<string,object> myDictionary = Dict<string,object>(
    "foo",    50,
    "bar",    100
);
Matt
A: 

using System; using System.Collections.Generic; using System.Linq; using System.Text;

namespace Dictionary { class Program { static void Main(string[] args) { Program p = new Program();

         Dictionary<object,object > d = p.Dic<object, object>("Age",32,"Height",177,"wrest",36);//(un)comment
         //Dictionary<object, object> d = p.Dic<object, object>();//(un)comment

        foreach(object o in d)
        {
            Console.WriteLine(" {0}",o.ToString());
        }
        Console.ReadLine();


    }

    public Dictionary<K, V> Dic<K, V>(params object[] data)
    {

       // if (data.Length == 0 || data == null || data.Length % 2 != 0) return null;
        if (data.Length == 0 || data == null || data.Length % 2 != 0) return new Dictionary<K,V>(1){{ (K)new Object(),(V)new object()}};

        Dictionary<K, V> dc = new Dictionary<K, V>(data.Length/2);
        int i=0;
        while(i < data.Length)
        {
            dc.Add((K)data[i],(V)data[++i]);
            i++;

        }
        return dc;

    }
}

}

Quadriceps Hexa