2010-10-20 42 views

回答

72
foreach(var newAnimal in NewAnimals) 
    Animals.Add(newAnimal.Key,newAnimal.Value) 

注意:這會在重複密鑰上引發異常。


或者,如果你真的想要去的擴展方法途徑(我不會),那麼你可以定義任何ICollection<T>工作有一個大致AddRange擴展方法,而不僅僅是Dictionary<TKey,TValue>

public static void AddRange<T>(this ICollection<T> target, IEnumerable<T> source) 
{ 
    if(target==null) 
     throw new ArgumentNullException(nameof(target)); 
    if(source==null) 
     throw new ArgumentNullException(nameof(source)); 
    foreach(var element in source) 
     target.Add(element); 
} 

(罰球上的重複鍵字典)

+0

沒問題。重複密鑰不是一個擔心。 – xbonez 2010-10-20 21:42:26

+0

我建議你看看我的解決方案並實現'AddRange'。我爲你做了所有的工作。 – Gabe 2010-10-20 21:46:42

+0

@gmcalab:我很欣賞它,但是這個解決方案對我來說工作得很好,而且體積更小。我真的在尋找一些能夠完成這項工作的小東西。 – xbonez 2010-10-21 12:07:30

7

最明顯的方法是:

foreach(var kvp in NewAnimals) 
    Animals.Add(kvp.Key, kvp.Value); 
    //use Animals[kvp.Key] = kvp.Value instead if duplicate keys are an issue 

由於Dictionary<TKey, TValue>明確實現ICollection<KeyValuePair<TKey, TValue>>.Add方法,你也可以這樣做:

var animalsAsCollection = (ICollection<KeyValuePair<string, string>>) Animals; 

foreach(var kvp in NewAnimals) 
    animalsAsCollection.Add(kvp); 

可惜的類不具有AddRange方法像List<T>呢。

+0

同意。 AddRange非常方便。 – xbonez 2010-10-20 21:41:55

+0

這就是爲什麼你寫一個擴展方法,這是這個問題的最佳解決方案,但沒有被OP選中。意大利麪條代碼啊! – Gabe 2010-10-20 21:46:03

0

你可以通過所有的動物循環中使用的foreach,放入NewAnimals。

30

創建擴展方法最有可能你會希望使用其再次這樣可以防止重複的代碼。

實現:

public static void AddRange<T, S>(this Dictionary<T, S> source, Dictionary<T, S> collection) 
{ 
     if (collection == null) 
     { 
      throw new ArgumentNullException("Collection is null"); 
     } 

     foreach (var item in collection) 
     { 
      if(!source.ContainsKey(item.Key)){ 
       source.Add(item.Key, item.Value); 
      } 
      else 
      { 
       // handle duplicate key issue here 
      } 
     } 
} 

用法:

Dictionary<string,string> animals = new Dictionary<string,string>(); 
Dictionary<string,string> newanimals = new Dictionary<string,string>(); 

animals.AddRange(newanimals); 
+0

爲什麼不輸入正確的參數爲'IEnumerable >'?爲什麼你只使用一個通用參數的鍵和值? – CodesInChaos 2010-10-20 21:52:58

+0

@CodesInChaos,將第二個參數設置爲IEnumerable >是什麼意思?特殊用例? – vkelman 2017-10-25 15:20:13

+0

我加 公共枚舉OnDuplicateKey { 投擲, 跳過, 更換 } – vkelman 2017-10-25 15:22:05