2010-06-16 29 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