2008-09-09 7 views
28

私は長い間C#をやってきましたが、ハッシュアップを簡単にする方法はありませんでした。リテラルハッシュはC#でですか?

私は最近、ハッシュとルーンのルビー構文に慣れ親しみました。ハッシュをリテラルとして宣言する簡単な方法を知っていますか?

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

答えて

31

C#3.0(.NET 3.5)を使用している場合は、コレクション初期化子を使用できます。彼らはRubyのようにかなり簡潔ではありませんが、改善はまだあります。

この例では、私はC#3.0を使用することはできませんよとき、私は辞書へのパラメータのセットを変換するヘルパー関数を使用し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

は:VisualStudioを/ ReSharperのは、私に語りました新しいDictionary ()内の括弧はオプションであり、冗長であることを示します。 2文字を保存する;) –

7

に基づいています。このような

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

用途:

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

C#3.0(.NET 3.5)ハッシュテーブルリテラルはそうのように指定することができるので:BTW

var ht = new Hashtable { 
    { "whatever", new Hashtable { 
      {"i", 1} 
    } }, 
    { "and then something else", new Hashtable { 
      {"j", 2} 
    } } 
}; 
関連する問題