2010-10-20 45 views
60

Bản sao có thể xảy ra:
Merging dictionaries in C#
What's the fastest way to copy the values and keys from one dictionary into another in C#?Thêm một từ điển khác

Tôi đã một cuốn từ điển có một số giá trị trong nó, nói:

Animals <string, string> 

tôi bây giờ nhận được một từ điển tương tự khác, ví dụ:

NewAnimals <string,string> 

Tôi có thể nối toàn bộ từ điển NewAnimals vào động vật bằng cách nào?

Trả lời

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

Lưu ý: điều này ném ngoại lệ trên khóa trùng lặp.


Hoặc nếu bạn thực sự muốn đi con đường phương pháp khuyến nông (tôi sẽ không), sau đó bạn có thể định nghĩa một phương pháp chung AddRange mở rộng hoạt động trên bất kỳ ICollection<T>, và không chỉ trên 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); 
} 

(ném vào phím trùng lặp cho từ điển)

+0

Không sao cả. Các khóa trùng lặp không phải lo lắng. – xbonez

+0

Tôi đề nghị bạn hãy xem giải pháp của tôi và triển khai 'AddRange'. Tôi đã làm tất cả công việc cho bạn. – Gabe

+0

@gmcalab: Tôi đánh giá cao nó, tuy nhiên giải pháp này hoạt động tốt cho tôi và nhỏ hơn rất nhiều. Tôi đã thực sự tìm kiếm một cái gì đó nhỏ mà thực hiện công việc. – xbonez

7

Cách rõ ràng nhất là:

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

Kể từ Dictionary<TKey, TValue> thực hiện một cách rõ ràng phương pháp ICollection<KeyValuePair<TKey, TValue>>.Add, bạn cũng có thể làm điều này:

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

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

Đó là một điều đáng tiếc lớp không có một phương pháp AddRange như List<T>.

+0

đồng ý. AddRange tiện lợi. – xbonez

+0

Đó là lý do tại sao bạn viết một phương pháp mở rộng, đó là giải pháp tốt nhất cho câu hỏi này nhưng không được chọn bởi OP. Mã spaghetti ahoy! – Gabe

0

Bạn có thể lặp qua tất cả các động vật sử dụng foreach và đặt nó vào NewAnimals.

30

Tạo một Phương pháp mở rộng nhiều khả năng bạn sẽ muốn sử dụng nhiều hơn một lần này và điều này ngăn chặn mã trùng lặp.

Thực hiện:

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

Cách sử dụng:

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

animals.AddRange(newanimals); 
+0

Tại sao bạn không nhập thông số đúng là 'IEnumerable > '? Và tại sao bạn chỉ sử dụng một tham số chung cho khóa và giá trị? – CodesInChaos

+0

@CodesInChaos, điểm nào có đối số thứ hai là IEnumerable >? Trường hợp sử dụng cụ thể? – vkelman

+0

tôi thêm enum công OnDuplicateKey { Ném, Bỏ qua, Thay } – vkelman

Các vấn đề liên quan