2017-06-21 75 views
2

如果我實例化一個新的Dictionary我可以在許多價值觀傳遞:添加幾行的C#字典一次

Dictionary<string, string> data = new Dictionary<string, string>(){ 
    { "Key1", "Value1" }, 
    { "Key2", "Value2" }, 
    { "Key3", "Value3" }, 
    { "Key4", "Value4" }, 
    { "Key5", "Value5" }, 
} 

不過,如果我已經有一個Dictionary,當它在一個參數傳遞,例如,我需要調用Add爲每個鍵 - 值對:

data.Add("Key1", "Value1"); 
data.Add("Key2", "Value2"); 
data.Add("Key3", "Value3"); 
data.Add("Key4", "Value4"); 
data.Add("Key5", "Value5"); 

我不知道是否有一個爲在同一時間加入在大量值以現有的詞典一個「的簡寫」方法 - 優選天然?如果是這樣,一個權威的「不」是受歡迎的。


沒有我想找的那麼幹淨,但是這些是我所知道的兩種選擇。

這一個允許一次傳遞多個值,但需要創建一個新的Dictionary而不是更新現有的一個:

Dictionary<string, string> newData = new Dictionary<string, string>(data) 
{ 
    { "Key6", "Value6"}, 
    { "Key7", "Value7"}, 
    { "Key8", "Value8"}, 
}; 

它也可以創建一個擴展方法,但仍對每行調用Add

public static void AddMany<Tkey, TValue>(this Dictionary<Tkey, TValue> dict, Dictionary<Tkey, TValue> toAdd) 
{ 
    foreach(KeyValuePair<Tkey, TValue> row in toAdd) 
    { 
     dict.Add(row.Key, row.Value); 
    } 
} 
+2

您在第一個示例中顯示的語法實際上被編譯器修改爲調用Add多次,所以效果相同 –

+0

@MatthewSteeples作爲初學者很好的瞭解C#dev –

+1

相關:https://stackoverflow.com/問題/ 6050633 /爲什麼 - 犯規 - 字典有-的AddRange –

回答

1

權威性 「不」 是值得歡迎的,如果是這樣的話。

既然如此。

不,不存在AddRange或等價物,因爲沒有實際的方法可以一次將多個項目添加到字典中。 List一次添加多個項目是有意義的,因爲它們可以通過一個命令複製到內部數組中。

對於Dictionary,必須計算每個項目的哈希碼以確定該值將存儲在哪個「桶」中,因此需要迭代每個項目。因此,AddRange方法或其等價物至多是句法糖。最糟糕的是,如果列表中的任何項目已經存在,則需要定義會發生什麼情況。它會拋出異常嗎?如果是這樣,在複製停留在字典之前添加的項目是否會被添加?如果沒有,它會默默地跳過該項目或替換重複?

這些問題沒有直觀的正確答案,因此無法預先定義。

0

如果您經常需要多個項目添加到您的字典中,你可以做一個擴展方法

public static class DictionaryExtensions 
{ 
    public static void AddRange<TKey, TValue>(this Dictionary<TKey, TValue> dic, List<KeyValuePair<TKey, TValue>> itemsToAdd) 
    { 
    itemsToAdd.ForEach(x => dic.Add(x.Key, x.Value)); 
    } 
} 

以上就可以了批量添加已知的唯一項目。如果你需要關心欺騙,那麼你想添加理智檢查,並可能會返回一個布爾名單,讓你知道哪些成功..但在這一點上,你可能會放棄擴展方法,因爲很多方便迷路了。