2012-09-25 5 views
27

두 컬렉션에 적어도 하나의 요소가 공통으로 있는지 확인하는 방법이 Linq에 있는지 궁금합니다. 나는 다음과 같은 것을 기대할 것입니다 :두 컬렉션에있는 요소를 확인하십시오

var listA = new List<int>() { some numbers }; 
var listB = new List<int>() { some numbers, potentially also in list A }; 

bool hasSameElements = listA.hasMatchingElements(listB); 

Linq에 존재합니까, 아니면 그것을위한 커스텀 메소드를 작성해야합니까?

나는 교차 방법을 알고 있지만 교차 세트 전체가 나오지 않습니까? 나는 두 컬렉션이 교차하는지 검사하는 것에 만 관심이 있습니다. 전체 세트를 얻는 것은 특히 큰 컬렉션에서 낭비처럼 보입니다.

bool hasSameElements = listA.Intersect(listB).Any(); 

편집 : 코멘트에 언급 한 바와 같이, Intersect 게으른 평가를 사용

+0

'인터 섹트 (Intersect) '는 요청 된만큼 많은 원소를 산출합니다. 'Any' 또는'FirstOrDefault'를 사용하거나'foreach'를 수행하고 첫 번째 반복을 중단하면 두 목록에 존재하는 _first_ 요소 만 찾을 수 있습니다. 나머지는 찾는다. – Rawling

+1

Howver,'Intersect' 연산은 첫 번째 요소가 나오기 전에 두 시퀀스 중 _one_가 _ 완전하게 읽혀 지도록 요구합니다. 입력 중 하나가 무한하다면, 완전히 소모 된 입력이 아닌지 확인하십시오. 참고로 [인터셉트]가 어떻게 작동하는지에 대한 [사양] (http://msdn.microsoft.com/en-us/library/bb460136.aspx)을 참고하십시오. – Rawling

답변

58

방금 ​​원하는 것 같은데. 첫 번째 요소가 결과에서 읽을 때까지 모두을 실행합니다. 이 시점에서 모두/listB을 세트로로드 한 다음 결과가 나타날 때까지 listA을 스트리밍합니다. 이 시점에서 Any()true을 반환하므로 더 이상 작업하지 않습니다. 자세한 내용은 내 Edulinq post on Intersect을 참조하십시오.

+0

처음으로 전체 교차 집합을 산출하지 않습니까? – zeebonk

+0

그런 다음 FirstOrDefault()를 사용 하시겠습니까? –

+0

@Lews -'int'에별로 도움이되지 않습니다. 두리스트 모두'0'을 포함한다면 어떨까요? – Rawling

관련 문제