2013-08-28 38 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]);