2010-06-16 57 views
4

我想基于共同的查找值将两个Dictionary集合加入到一起。Linq使用公用密钥加入两个字典

 var idList = new Dictionary<int, int>(); 
     idList.Add(1, 1); 
     idList.Add(3, 3); 
     idList.Add(5, 5); 

     var lookupList = new Dictionary<int, int>(); 
     lookupList.Add(1, 1000); 
     lookupList.Add(2, 1001); 
     lookupList.Add(3, 1002); 
     lookupList.Add(4, 1003); 
     lookupList.Add(5, 1004); 
     lookupList.Add(6, 1005); 
     lookupList.Add(7, 1006); 

// Something like this: 
      var q = from id in idList.Keys 
        join entry in lookupList on entry.Key equals id 
        select entry.Value; 

上面的Linq语句只是一个例子,不能编译。对于idList中的每个条目,根据匹配的键从lookupList中提取值。

结果应该是来自lookupList(1000,1002,1004)的值的列表。

使用Linq来做这件事最简单的方法是什么?

谢谢

里克

+0

当某些东西不能编译时,包含编译器告诉你的东西是很好的形式。 – 2010-06-16 21:20:40

+0

对不起,我觉得我离正确的答案还很远。 – rboarman 2010-06-16 21:28:42

回答

14
from id in idList.Keys 
where lookupList.ContainsKey(id) 
let value1 = idList[id] 
let value2 = lookupList[id] 
select new {id, value1, value2} 

,或者更经典

from kvp1 in idList 
join kvp2 in lookupList on kvp1.Key equals kvp2.Key 
select new {key = kvp1.Key, value1 = kvp1.Value, value2 = kvp2.Value} 

查询中的错误是作用域之一:

from a in theAs 
join b in theBs on (leftside) equals (rightside) 

a在左边区域范围内。 b在权利范围内。

+0

谢谢大家!令人敬畏的周转时间。 :) – rboarman 2010-06-16 21:26:02

1

我很抱歉,如果我误解了你的问题,但是你只是想从列表B中检索值,只有列表A具有KeyValuePair和相同的密钥?

from lookup in lookupList 
where idList.Keys.Contains(lookup.Key) 
select lookup.Value; 
+0

哇!你很快。我会在一分钟内接受。谢谢。 – rboarman 2010-06-16 21:17:48

+0

我会投票,但继续接受大卫B的答案。他以更多的细节打败了我,让它更公平更方便。 :) – 2010-06-16 21:18:37

+0

将.AsQueryable()添加到语句的末尾是否安全?这样做是否有性能问题?查找集合非常大。 – rboarman 2010-06-16 21:24:31

0
 var q = from id in idList 
       join entry in lookupList 
        on id.Key equals entry.Key 
       select entry.Value; 

你想要的LINQ语句将看起来像,ID和条目需要被周围的条件切换。

0

您对此有何看法?

var values = idList.Keys.Select(i => lookupList[i]); 
+0

KeyNotFoundException – 2010-06-16 21:18:48

+0

啊,我明白了。你有不匹配的东西。我应该将其更改为Keys.Contains。无论如何,内森的答案是要走的路。 – Marcote 2010-06-16 21:21:52