2011-08-01 27 views
9

Cách hợp nhất 2 từ điển của IDictionary<Guid, MyObject> trong đó MyObject là phiên bản lớp?Hợp nhất 2 từ điển có các khóa trùng lặp với linq

IDictionary<Guid, MyObject> d1 = new Dictionary<Guid, MyObject>(); 
d1.Add(guid1, m1); 
d1.Add(guid2, m2); 
d1.Add(guid3, m3); 
IDictionary<Guid, MyObject> d2 = new Dictionary<Guid, MyObject>(); 
d2.Add(guid2, m2); 
d2.Add(guid3, m3); 
d2.Add(guid4, m4); 
IDictionary<Guid, MyObject> d3 = d1.Union(d2) ??? 

Đó trong d3 có các mục sau:

guid1,m1 
guid2,m2 
guid3,m3 
guid4,m4 
+0

bản sao của http://stackoverflow.com/questions/294138/merging-dictionaries-in-c – hatchet

+0

xin lỗi, tôi không thể tìm thấy solutiion tôi có –

+0

thể trùng lặp của [Kết hợp hai Từ điển với LINQ] (http://stackoverflow.com/questions/4903784/combine-two-dictionaries-with-linq); chính xác hơn so với số khác –

Trả lời

9

d1.Concat (d2.Where (x =>! D1.Keys.Contains (x.Key)));

+1

cảm ơn bạn rất nhiều, đó là cách tiếp cận chính xác mặc dù xử lý hàng đầu của bộ ghép nối –

+0

@Eric Điều này trông giống như một giải pháp tốt. Nhưng, nếu tôi có phần tử 'IEnuemrable >', tôi có thể so khớp các mục như thế nào? – barteloma

0

Bạn có thể thử một cái gì đó giống như

d1.Concat(d2).Distinct(kv => kv.Key).ToDictionary(kv => kv.Key, kv => kv.Value) 

Kết quả của concat tận dụng thực tế là từ điển là một IEnumerable<KeyvaluePair<Guid,MyObject>>

Vì tôi không có compi Tôi chỉ kiểm tra rằng Distinct không thể chấp nhận chỉ là một lambda chọn tài sản để được so sánh. Tuy nhiên nó có thể chấp nhận EqualityComparer. Những gì tôi thường có trong các dự án là một Comparality Comparality chung cho phép để vượt qua trong lambdas xác định hoạt động bình đẳng.

+0

có, so sánh bình đẳng là cần thiết –

0

Khi không có phím bản sao tồn tại, các công việc sau cho 2 (hoặc nhiều hơn) các từ điển:

var dictionaries = new [] { d1, d2 }; 
var result = dictionaries.SelectMany(dict => dict) 
        .ToDictionary(pair => pair.Key, pair => pair.Value); 
+1

ok, có bản sao hiện tại –

5

d1.Union(d2).GroupBy (kvp => kvp.Key).ToDictionary(kvp => kvp.Key, kvp => kvp.First().Value); ra để làm các trick.

IDictionary<Guid, MyObject> d1 = new Dictionary<Guid, MyObject>(); 
d1.Add(guid1, m1); 
d1.Add(guid2, m2); 
d1.Add(guid3, m3); 
IDictionary<Guid, MyObject> d2 = new Dictionary<Guid, MyObject>(); 
d2.Add(guid2, m2); 
d2.Add(guid3, m3); 
d2.Add(guid4, m4); 
IDictionary<Guid, MyObject> d3 = 
    d1.Union(d2).GroupBy (kvp => kvp.Key) 
     .ToDictionary (kvp => kvp.Key, kvp => kvp.First().Value); 
+0

cảm ơn nhưng tôi đã thử điều đó và Liên minh dẫn đến Ngoại lệ với 'Một mục có cùng khóa đã được thêm' –

+0

Tôi đã sửa nó. 'IDictionary d3 = d1.Union (d2) .GroupBy (kvp => kvp.Key) .ToDictionary (kvp => kvp.Key, kvp => kvp.First() .Value); ' –

+0

cảm ơn bạn rất nhiều, hoạt động, cách dòng đó tránh các khóa trùng lặp? nhanh hơn 'd1.Concat (d2.Where (x =>! D1.Keys.Contains (x.Key)))'? –

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