2010-07-05 3 views
24

내에 존재, 나는이 작업을 수행 할 수 있습니다람다 식 목록

list.Where(r => r.Id == idToCompare); 

어떤 경우를 대신 단일 idToCompare, 나는 ID의 목록을 가지고 비교할 것인가?

미리 정의 된 목록과 비교하기위한 구문은 무엇입니까? 같은 뭔가 : listOfIds가리스트

int[] listofIds = GetListofIds(); 

list.Where(r => r.Id "in listofIds"); 

답변

46

경우,이 (List.Contains을 작동하지만 것)는 선형 검색, 그래서 이것은 대단히 효율적이지 않습니다.

검색하고 싶은 ID를 Set와 같이 검색에 적합한 컨테이너에 저장하는 것이 좋습니다.

List<int> listOfIds = new List(GetListOfIds()); 
lists.Where(r=>listOfIds.Contains(r.Id)); 
4
당신이 (가) 포함 사용할 수 있습니다

() 확장 방법 :

list.Where(r => listofIds.Contains(r.Id)) 
19
var query = list.Where(r => listofIds.Any(id => id == r.Id)); 

또 다른 방법은, 유용는 listOfIds 배열이 큰 경우 :

HashSet<int> hash = new HashSet<int>(listofIds); 
var query = list.Where(r => hash.Contains(r.Id)); 
+2

엔티티 프레임 워크와 함께 사용 (그리고 아마도 LINQ - 투 - SQL)이이 사실로 변환합니다 "SELECT * FROM Table (1, 2, 3, 4) "의 id를 사용하여 서버를 한 번만 방문하십시오. –

+0

@IgorZevaka - EF를 사용하여 DB를 쿼리 할 경우 SortedSet (HashSet의 수퍼 집합)을 사용하는 것이 더 좋습니다. HashSet과 같은 Unique도 있지만 Sorted도 있습니다. 그런 다음 'Where'절을 실행하려고하는 내 Db 열을 인덱싱합니다. 이는 대용량 데이터에서 훨씬 빠릅니다. – sandiejat

0

내가 볼 것 가입 연산자 :

from r in list join i in listofIds on r.Id equals i select r 

이 방법은 Contains 메서드를 통해 어떻게 최적화 될지 모르지만 적어도 컴파일러에게 수행하려는 작업에 대한 더 나은 아이디어를 제공합니다. 그것은 또한 당신이 달성하고자하는 것과도 근본적으로 가깝습니다.

편집 : (내가 그것을 알아 냈어요 이니까) 완전성에 대한 확장 메서드 구문 :

var results = listofIds.Join(list, i => i, r => r.Id, (i, r) => r); 
+1

나는 동일한 대답을 게시하려했으나 (확장 방법 구문을 사용했지만 개인적인 선호도에 불과 함). 그리고'join'은'Contains'보다 더 최적화되어 있습니다. 왜냐하면'list'의 모든 멤버에 대해'listOfIds'에서 순차적 검색을하기보다는 양쪽에서 키의 메모리 내 해시 테이블을 구성하기 때문입니다. –

+0

@Anthony Pegram : 고마워, 그냥 알아 냈어. 내 의견을 삭제 했어, 미안. 참고로 구문을 이해할 수 없어 도움을 요청했습니다. – TheEvilPenguin