2010-06-16 4 views
4

일반적인 조회 값을 기반으로 두 개의 사전 모음을 함께 결합하려고합니다.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)의 Values ​​목록이어야합니다.

Linq를 사용하여 가장 쉬운 방법은 무엇입니까?

+0

어떤 것이 컴파일되지 않으면 컴파일러에서 알려주는 내용을 포함시키는 것이 좋습니다. –

+0

죄송합니다, 나는 정답에서 꽤 멀다고 느꼈습니다. – rboarman

답변

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

1

귀하의 질문을 오해 한 경우 사과 드리지만 목록 A에 Key가있는 KeyValuePair가있는 목록 B에서만 값을 검색하고 싶습니까? 원하는 LINQ 문은 그 모양을

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

와우! 너 빠르구나. 내가 수락 할께. 고맙습니다. – rboarman

+0

나는 투표를하러 갈 것이지만 David B의 대답을 받아 들일 것이다. 그는 나를 더 공평하고 정교하게 때려 줬다. :) –

+0

.AsQueryable()을 문장 끝에 추가하는 것이 안전합니까? 그렇게함으로써 성능에 대한 우려가 있습니까? 조회 컬렉션은 상당히 큽니다. – rboarman

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

은, ID 및 항목은 조건에 주위를 전환 할 필요가 있었다.

0

이 점에 대해 어떻게 생각하십니까?

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

KeyNotFoundException –

+0

아, 알겠습니다. 너는 일치하지 않는 것들을 가지고있다. 열쇠로 바꿔야 해. 포함 해. 어쨌든 네이선의 대답은 갈 길입니다. – Marcote

관련 문제