Question

Je fais du c# pour une longue période de temps, et n'ai jamais rencontré un moyen facile de simplement de nouvelles d'un hachage.

J'ai récemment de se familiariser avec la syntaxe ruby de hachages et d'émerveillement, personne ne sait d'une façon simple de déclarer un hachage comme un littéral, sans avoir à faire tout le ajouter des appels.

{ "whatever" => {i => 1}; "and then something else" => {j => 2}};
Était-ce utile?

La solution

Si vous êtes à l'aide de C# 3.0 (.NET 3.5) alors vous pouvez utiliser les initialiseurs de la collection.Ils ne sont pas tout à fait aussi laconique, comme en Ruby, mais encore une amélioration.

Cet exemple est basé sur l' MSDN Exemple

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, }}
};

Autres conseils

Quand je ne suis pas en mesure d'utiliser le C# 3.0, j'utilise une fonction d'assistance qui se traduit par un ensemble de paramètres dans un dictionnaire.

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;
}

Utiliser comme ceci:

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

Depuis C# 3.0 (.NET 3.5) table de hachage littéraux peut être spécifié comme suit:

var ht = new Hashtable {
    { "whatever", new Hashtable {
            {"i", 1} 
    } },
    { "and then something else", new Hashtable { 
            {"j",  2}
    } }
};
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;            
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top