2014-05-09 33 views
12

如果我不想多次調用「.Add()」,將多個值添加到Dictionary中的最佳方法是什麼? 編輯:我想在開始後填寫它!詞典中已經有一些值了!如何向C#中的Dictionary添加多個值

所以不是

myDictionary.Add("a", "b"); 
    myDictionary.Add("f", "v"); 
    myDictionary.Add("s", "d"); 
    myDictionary.Add("r", "m"); 
    ... 

我想要做的somethinng這樣

myDictionary.Add(["a","b"], ["f","v"],["s","d"]); 

有沒有辦法這麼呢?

+1

http://msdn.microsoft.com/en-us/library/bb531208.aspx – Marc

+0

[在C#中合併字典]的可能重複(http://stackoverflow.com/questions/294138/merging-dictionaries-in -c-sharp) –

回答

4

這不完全是一個重複的問題,但你可能想要的是有一個Dictionary.AddRange()方法。這裏就是爲什麼不存在:

Why doesn't Dictionary have AddRange?

「範圍不會真的有什麼意義的關聯容器。」

但它可能是寫自己的.AddRange()法Dictionary類是一個好主意。它本質上是.Add()調用的一個循環。

13

可以使用大括號的是,雖然這只是初始化工作:

var myDictionary = new Dictionary<string, string> 
{ 
    {"a", "b"}, 
    {"f", "v"}, 
    {"s", "d"}, 
    {"r", "m"} 
}; 

這就是所謂的「集合初始化」,並適用於任何ICollection<T>(見link的字典或本link任何其他集合類型)。事實上,它爲實現IEnumerable,幷包含一個Add方法的對象類型:

class Foo : IEnumerable 
{ 
    public void Add<T1, T2, T3>(T1 t1, T2 t2, T3 t3) { } 
    // ... 
} 

Foo foo = new Foo 
{ 
    {1, 2, 3}, 
    {2, 3, 4} 
}; 

基本上這是調用Add - 方法反覆只是語法糖。初始化後有幾個方法可以做到這一點,其中一個是手動調用Add - 方法:

var myDictionary = new Dictionary<string, string> 
    { 
     {"a", "b"}, 
     {"f", "v"} 
    }; 

var anotherDictionary = new Dictionary<string, string> 
    { 
     {"s", "d"}, 
     {"r", "m"} 
    }; 

// Merge anotherDictionary into myDictionary, which may throw 
// (as usually) on duplicate keys 
foreach (var keyValuePair in anotherDictionary) 
{ 
    myDictionary.Add(keyValuePair.Key, keyValuePair.Value); 
} 

或者作爲擴展方法:

static class DictionaryExtensions 
{ 
    public static void Add<TKey, TValue>(this IDictionary<TKey, TValue> target, IDictionary<TKey, TValue> source) 
    { 
     if (source == null) throw new ArgumentNullException("source"); 
     if (target == null) throw new ArgumentNullException("target"); 

     foreach (var keyValuePair in source) 
     { 
      target.Add(keyValuePair.Key, keyValuePair.Value); 
     } 
    } 
} 

var myDictionary = new Dictionary<string, string> 
    { 
     {"a", "b"}, 
     {"f", "v"} 
    }; 

myDictionary.Add(new Dictionary<string, string> 
    { 
     {"s", "d"}, 
     {"r", "m"} 
    }); 
+0

啓動後無法填充它? – LocalHorst

+2

另一個for/foreach循環與'Add'結合使用。這只是添加方法的語法糖。對於'Dictionary ''AddRange'沒有這樣的事情,因爲無論如何都需要對密鑰進行散列。 – Caramiriel

3

你可以這樣說:

var myDict = new Dictionary<string, string>() 
{ 
    {"a", "aa"}, 
    {"b", "bb"}, 
    {"c", "cc"}, 
    {"d", "dd"} 
}; 
0

這本來是一個簡單的谷歌搜索:http://msdn.microsoft.com/en-us/library/bb531208.aspx。 反正...這裏是代碼:

Dictionary<string, string> myDictionary = new Dictionary<string, string>() 
{ 
    { 'a', 'b' }, 
    { 'c', 'd' }, 
    { 'e', 'f' } 
}; 

當然,你也可以寫一個循環或東西來遍歷你的價值觀和調用每次。新增()方法。

0

好了,你可以在初始化:

new Dictionary<string, string> { {"a","b"}, {"f","v"},{"s","d"} } 

這稱爲集合初始化。 當您想要將多個項目添加到已存在的詞典時,您可以編寫一個方法。

1

你可以在初始化做到像所有其他的答案顯示,或者你可以用這一招結合起來:

Dictionary<string, string> myDictionary = new Dictionary<string, string>(); 
Dictionary<string, string> secondDictionary = new Dictionary<string, string>() 
{ 
    {"1", "a"}, 
    {"2", b"} 
}; 
myDictionary = myDictionary.Union(secondDictionary) 
          .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 

你必須確保有沒有重複鍵,否則你會得到一個異常(但這與Add方法相同)。

+0

'Union'將導致另一個'IEnumerable '這不再是字典。這可能也包含重複的鍵,因爲'KeyValuePair '沒有實現基於鍵的相等/散列碼(假設它創建了一個字典)。 – Caramiriel

+0

增加了'ToDictionary'和重複鍵的註釋。 – Raidri

-1

這可以在某種程度上,讓您減少其中使用擴展方法發生雜波進行了主代碼路徑。

public static class DictionaryExtensions{ 
public static Dictionary<TKey,TValue> AddRange<TKey,TValue>(this IDictionary<TKey,TValue> source,params KeyValuePair<TKey,TValue>[] items){ 
    foreach (var keyValuePair in items) 
    { 
     source.Add(keyValuePair.Key, keyValuePair.Value); 
    } 
    return source; 
    } 
} 
3

雖然問題已經回答了,我很好奇,如果有可能,以集合初始化器的語法適用於已初始化沒有創建第二詞典合併創建/開銷字典並扔掉。

您可以使用(濫用?)Collection Initializers在之後向現有的字典添加一系列值。怎麼樣?通過創建一個輔助類來做到這一點:

public class AddRangeTo<TKey, TValue> : IEnumerable 
{ 
    private readonly IDictionary<TKey, TValue> WrappedDictionary; 

    public AddRangeTo(IDictionary<TKey, TValue> wrappedDictionary) 
    { 
     this.WrappedDictionary = wrappedDictionary; 
    } 

    public void Add(TKey key, TValue value) 
    { 
     this.WrappedDictionary.Add(key, value); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     throw new NotSupportedException(); 
    } 
} 

的使用方式:

var myDictionary = new Dictionary<string, string>(); 

new AddRangeTo<string, string>(myDictionary) 
{ 
    {"a", "b"}, 
    {"f", "v"}, 
    {"s", "d"}, 
    {"r", "m"} 
}; 

注意這允許您將條目添加到使用類似的語法字典,而是一個已經被初始化的字典。那種吸引人的部分是泛型的重複,但這不需要來C#6.0。 (編輯:也就是說,在C#6它看起來像new AddRangeTo(myDictionary)

這一切都這樣說(編輯這項功能是從C#6報廢),我真的不建議一定這樣做。這是奇數語法/用法與意想不到的副作用,我認爲可能會讓他人感到困惑,當他們遇到它。但是如果你發現你實際上會使用這麼多的代碼,並且使你的內部代碼更容易使用和維護,那麼獎金!

-1

myDictionary =新詞典(){{ 「一」,2)},{ 「B」,3},};

+0

請正確地閱讀問題。開始後,字典必須填寫。 – LocalHorst