2011-08-01 147 views
9

如何合併IDictionary<Guid, MyObject>的2個字典其中MyObject是一個類實例?合併2個與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) ??? 

,在d3有以下條目:

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

http://stackoverflow.com/questions/294138/merging-dictionaries-in-c – hatchet

+0

重複對不起,我找不到我的solutiion那裏 –

+0

可能重複[多合一兩個詞典與linq](http://stackoverflow.com/questions/4903784/combine-two-dictionaries-with-linq);更確切的複製比另一個 –

回答

9

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

+1

非常感謝你,這是通過連接集的領先處理的正確方法 –

+0

@Eric這看起來是一個很好的解決方案。但是,如果我有'IEnuemrable >'集合,我該如何匹配項目? – barteloma

0

你可以嘗試像

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

CONCAT的結果利用的事實,詞典是IEnumerable<KeyvaluePair<Guid,MyObject>>

由於我沒有compi我只是檢查了Distinct不能接受只選擇要比較的屬性的lambda。但它可以接受一個EqualityComparer。我經常在項目中使用的是通用平等比較器,它允許傳入定義相等操作的lambda表達式。

+0

是的,需要相等比較器 –

0

當沒有重複項存在,2(或更多)的字典了以下工作:

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

好的,有重複的存在 –

5

d1.Union(d2).GroupBy (kvp => kvp.Key).ToDictionary(kvp => kvp.Key, kvp => kvp.First().Value);出這樣的伎倆。

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

謝謝,但我試過,聯盟導致異常與'具有相同的密鑰項目已被添加' –

+0

我修好了。 (kvp => kvp.Key,kvp => kvp.First().Value); ' –

+0

非常感謝你,那有效,如何避免重複密鑰行? 比'd1.Concat(d2.Where(x =>!d1.Keys.Contains(x.Key))'''更快。 –