2009-04-03 22 views
44

Tôi có hai từ điển loại <string,object> trong C#. Làm cách nào để sao chép tất cả nội dung của một đối tượng Từ điển sang đối tượng khác mà không áp dụng vòng lặp?Làm cách nào để kết hợp hai từ điển không lặp?

+0

Tên loại trong câu hỏi của bạn dường như đã chuyển sang AWOL. – dommer

+0

nếu bạn đang tìm kiếm một sự hợp nhất, bạn nên tham khảo: http://stackoverflow.com/questions/294138/merging-dictionaries-in-c – annakata

Trả lời

5
var result = dictionaries.SelectMany(dict => dict) 
      .ToDictionary(pair => pair.Key, pair => pair.Value); 
38

Bạn có thể sử dụng Concat:

Dictionary<string, object> d1 = new Dictionary<string, object>(); 
d1.Add("a", new object()); 
d1.Add("b", new object()); 
Dictionary<string, object> d2 = new Dictionary<string, object>(); 
d2.Add("c", new object()); 
d2.Add("d", new object()); 

Dictionary<string, object> d3 = d1.Concat(d2).ToDictionary(e => e.Key, e => e.Value); 

foreach (var item in d3) 
{ 
    Console.WriteLine(item.Key); 
} 
+1

Điều này sẽ trả về một chuỗi > IEnumerable, bạn sẽ cần gọi ToDictionary để lấy từ điển. –

+0

Đúng vậy. Cảm ơn bạn đã chỉ ra điều đó. Sẽ chỉnh sửa. –

9

Đầu tiên, đó là không thể thực hiện mà không cần vòng lặp. Cho dù vòng lặp đó được thực hiện trong một phương thức (mở rộng) là không liên quan, nó vẫn yêu cầu một vòng lặp.

Tôi thực sự sẽ khuyên bạn nên thực hiện thủ công. Tất cả các câu trả lời khác được đưa ra yêu cầu sử dụng hai phương pháp mở rộng (Concat - ToDictionary và SelectMany - ToDictionary) và do đó lặp lại hai lần. Nếu bạn đang làm điều này để tối ưu hóa mã của bạn, sẽ nhanh hơn để lặp lại từ điển B và thêm nội dung đó vào từ điển A.

Chỉnh sửa: Sau khi điều tra thêm, thao tác Concat sẽ chỉ xuất hiện trong Từ điển gọi, nhưng tôi vẫn nghĩ rằng một phương pháp mở rộng tùy chỉnh sẽ hiệu quả hơn.

Nếu bạn muốn giảm kích thước mã của bạn, sau đó chỉ cần thực hiện một phương pháp khuyến nông:

public static class DictionaryExtensions 
{ 
    public static IDictionary<TKey,TVal> Merge<TKey,TVal>(this IDictionary<TKey,TVal> dictA, IDictionary<TKey,TVal> dictB) 
    { 
     IDictionary<TKey,TVal> output = new Dictionary<TKey,TVal>(dictA); 

     foreach (KeyValuePair<TKey,TVal> pair in dictB) 
     { 
      // TODO: Check for collisions? 
      output.Add(pair.Key, Pair.Value); 
     } 

     return output; 
    } 
} 

Sau đó, bạn có thể sử dụng nó bằng cách nhập ('sử dụng') namespace DictionaryExtensions và viết:

IDictionary<string,objet> output = dictA.Merge(dictB); 

Tôi đã thực hiện phương pháp hành động như các đối tượng là bất biến, nhưng bạn có thể dễ dàng sửa đổi nó để không trả về một từ điển mới và chỉ nhập vào dictA.

87
var d3 = d1.Concat(d2).ToDictionary(x => x.Key, x => x.Value); 
+0

Điều này hoàn toàn giống với câu trả lời của bruno. –

+0

Simplefied nhưng cùng một câu trả lời có, không phải là một lý do để downvote – RvdK

+0

Xin lỗi nhưng tôi đã đăng trước khi bruno cập nhật câu trả lời của mình để bao gồm các cuộc gọi ToDictionary - trước đó mã đã trở về một IEnumerable

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