2013-07-19 56 views
4

值在C#2.0中,我們可以初始化數組,並列出其值是這樣的:初始化字典在C#2.0

int[] a = { 0, 1, 2, 3 }; 
int[,] b = { { 0, 1 }, { 1, 2 }, { 2, 3 } }; 
List<int> c = new List<int>(new int[] { 0, 1, 2, 3 }); 

我願做同樣的解釋。我知道你可以輕鬆地在C#3.0以上版本中這樣做:

Dictionary<int, int> d = new Dictionary<int, int> { { 0, 1 }, { 1, 2 }, { 2, 3 } }; 

但它在C#2.0中不起作用。有沒有使用Add或基於已有的集合的任何解決方法?

+4

什麼限制你仍然使用C#2?從C#3開始,生活變得更加美好,即使你的目標是.NET 2,也值得嘗試去更新一個編譯器...... –

+0

哈哈,我想知道我是否應該不要回答你的問題沒有。使用C#2是我不能做太多工作的一個要求。我知道較新的C#版本可以讓事情變得更容易,但是由於我已經遇到了這個問題,我想我會問好奇。 –

+0

我很感興趣,爲什麼*有這個要求。受限於.NET 2.0,我可以理解,但C#2似乎是一個奇怪的要求。 –

回答

10

但它在C#2.0中不起作用。有沒有任何解決方法,而不使用添加或基於已經存在的集合?

public class DictionaryBuilder<TKey, TValue> 
{ 
    private Dictionary<TKey, TValue> dictionary 
     = new Dictionary<TKey, TValue> dictionary(); 

    public DictionaryBuilder<TKey, TValue> Add(TKey key, TValue value) 
    { 
     if (dictionary == null) 
     { 
      throw new InvalidOperationException("Can't add after building"); 
     } 
     dictionary.Add(key, value); 
     return this; 
    } 

    public Dictionary<TKey, TValue> Build() 
    { 
     Dictionary<TKey, TValue> ret = dictionary; 
     dictionary = null; 
     return ret; 
    } 
} 

然後你可以使用:

Dictionary<string, int> x = new DictionaryBuilder<string, int>() 
    .Add("Foo", 10) 
    .Add("Bar", 20) 
    .Build(); 

這至少

我能想到的是寫自己DictionaryBuilder類型,使其更簡單最接近號一個單個表達式仍然存在,這對於要在聲明點初始化的字段很有用。

+0

Skeet,你的流利語法不起作用,因爲'Add'不會'返回這個;'。 –

+0

@newStackExchangeInstance:已修復,謝謝。 –

+0

@機械對象:感謝您修復報價,但請不要先檢查其他人的答案中的*語義*代碼。我非常刻意將代碼按照這種方式進行:我會認爲它是一個*錯誤*多次添加相同的密鑰;我不想默默地忽略它。 (另一種方法是使用索引器,它會覆蓋舊的條目 - 而且,這會悄然隱藏一個問題。) –