2013-08-28 65 views
1

嗨我有兩個字典,我需要找到一種方法將它們連接在一起。這裏有兩種字典類型。加入兩個字典

IDictionary<string, byte[]> dictionary1 
IDictionary<IFileShareDocument, string> dictionary2 

出這兩個庫的我要創建第三個字典,像這樣

IDictionary<IFileShareDocument, byte[]> dictionary3 

兩個字典有相同數量的項目和他們兩人的字符串屬性是連接點。

我想什麼是能夠寫一些東西,會做somethign這樣的:

dictionary1.value join with dictionary2.key 
where dictionary1.key == dictionary2.value 

This statement should result in dictionary3. 

有什麼辦法,我可以做到這一點,我似乎無法找到一個方法來做到這一點?

回答

2

這裏有一個辦法做到這一點使用LINQ查詢語法,與join(這編譯成大致相同的事情@金王的解決方案):

IDictionary<IFileShareDocument, byte[]> dictionary3 = 
    (from item1 in dictionary1 
    join item2 in dictionary2 on item1.Key equals item2.Value 
    select new { item2.Key, item1.Value }) 
     .ToDictionary(x => x.Key, x => x.Value); 

注意上面大大首選這個例子使用fromwhere,因爲它更高效。我在這裏包括,因爲如果你像我一樣(更熟悉SQL,這將是這樣的轉換爲自動加入),這個可憐的方法可能是出現在腦海的第一個:

IDictionary<IFileShareDocument, byte[]> dictionary3 = 
    (from item1 in dictionary1 
    from item2 in dictionary2 
    where item1.Key == item2.Value 
    select new { item2.Key, item1.Value }) 
     .ToDictionary(x => x.Key, x => x.Value); 
+0

第一個解決方案比第二個解決方案執行*顯着*更差。連接是O(N + M),笛卡爾積是O(N * M)。只要相關密鑰已經具有合理的哈希碼和相等實現(他們這樣做),假設你實際上想要一個Join,根本就沒有任何真正的笛卡爾乘積優勢。 – Servy

+0

@Servy感謝您指出這一點;我已經交換了我的解決方案,並附上說明爲什麼'join'更好。 –

+0

爲什麼要包含其他解決方案呢?它沒有優點,只有缺點。在那裏獲得什麼? – Servy

5
var dictionary3 = 
    dictionary1 
     .Join(dictionary2, x => x.Key, x => x.Value, (x, y) => new { x, y }) 
     .ToDictionary(a => a.y.Key, a => a.x.Value); 
2

這對你有用嗎?

var result = 
    dictionary2 
     .ToDictionary(x => x.Key, x => dictionary1[x.Value]);