Littérale des hachages en c#?
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}};
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;
}
}
}