2008-09-09 6 views
28

Je fais du C# depuis longtemps, et je n'ai jamais trouvé un moyen facile d'en faire un nouveau.Les hachages littéraux dans C#?

J'ai récemment pris connaissance de la syntaxe ruby ​​des hachages et des merveilles, est-ce que quelqu'un connaît un moyen simple de déclarer un hachage comme un littéral, sans faire tous les appels d'ajout.

{ "whatever" => {i => 1}; "and then something else" => {j => 2}}; 

Répondre

31

Si vous utilisez C# 3.0 (.NET 3.5), vous pouvez utiliser des initialiseurs de collection. Ils ne sont pas aussi concis que chez Ruby, mais c'est quand même une amélioration.

Cet exemple est basé sur la 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, }} 
}; 
+3

BTW: VisualStudio/ReSharper me dit , que les parenthèses dans le nouveau Dictionary () sont facultatives et redondantes. Enregistre deux caractères;) –

7

Quand je ne suis pas en mesure d'utiliser C# 3.0, j'utilise une fonction d'aide 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; 
} 

Utilisez comme ceci:

IDictionary<string,object> myDictionary = Dict<string,object>(
    "foo", 50, 
    "bar", 100 
); 
-1
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;    
     } 
    } 
} 
1

Depuis C# 3.0 (.NET 3.5) littéraux Hashtable peuvent être spécifiés comme ceci:

var ht = new Hashtable { 
    { "whatever", new Hashtable { 
      {"i", 1} 
    } }, 
    { "and then something else", new Hashtable { 
      {"j", 2} 
    } } 
}; 
Questions connexes