2012-04-03 3 views
1

두 가지 유형의 목록이 있습니다. 목록 2에없는 요소를 list1에서 제거해야하며 list2 요소는 특정 기준을 만족해야합니다.LINQ 두 가지 유형의 교차점

여기 제가 시도한 것은 작동하지만 각 요소는 두 번 나열되어 있습니다.

var filteredTracks = 
        from mtrack in mTracks 
        join ftrack in tracksFileStatus on mtrack.id equals ftrack.Id 
        where mtrack.id == ftrack.Id && ftrack.status == "ONDISK" && ftrack.content_type_id == 234 
        select mtrack; 

이상적으로는 제자리에 mTracks을 수정할 수는 filteredTracks의 새 복사본을 만들고 싶지 않아?

답변

4

두 개의 시퀀스 중 하나 또는 둘 모두에서 id 필드가 고유하지 않기 때문에 중복되는 경우가 있습니다. 또한 성공하려면 조인이 이미 충족되어야하므로 where mtrack.id == ftrack.Id이라고 말할 필요가 없습니다.

여기서는 루프를 사용하고 있지만 LINQ에서 죽은 경우 을 Id 필드로 그룹화해야 할 수 있습니다. 당신이 게시 한 내용으로 말하기는 어렵습니다.

"mTracks을 제자리에서 수정하는 것"까지는 가능하지 않거나 보람 있습니다. mTracksIEnumerable<T>에서 파생 된 것으로 가정합니다. 이 접근법의 효율성에 대해 걱정한다면 Id 값을 키로 가지는 사전과 같은 다른 종류의 데이터 구조를 사용하는 것이 좋습니다. 질문이 목록에 대해 이었기 때문에

+0

+1은 중복 소스를 설명합니다. 'Distinct' 호출은 중복을 제거 할 수도 있지만 사용을 고려하기 전에 어디에서 중복이 왔는지 알고 싶습니다. – devgeezer

+0

devgeezer : 동의 했으므로 데이터를 이해해야합니다. 또한 객체의 'IEquatable '구현 (있는 경우)에 따라 'IEqualityComparer '에서 파생 된 맞춤 클래스를 작성하여 'Distinct()'를 사용해야 할 수도 있습니다. – jnylen

+0

답장을 보내 주셔서 감사합니다! List1을 드라이버로 검색하고 list2에서 검색하는 것이 가능합니까? 루프는 쉽게 수행 할 수 있지만 LINQ에서 시작하고 LINQ – Overture

2

주로 ...
이 ...

var test = (from m in mTracks 
      from f in fTracks 
      where m.Id == f.Id && ... 
      select m); 

당신이 최적화해야하지만, 예를 LINQ 현명한 아마도 더
목록이 정렬되어 있습니까? 그럴 경우 예를 들어 Best algorithm for synchronizing two IList in C# 2.0
Db (여기서는 분명하지 않음)에서 오는 경우 SQL/관계 및 Db에있는 인덱스를 기반으로하는 linq 쿼리를 작성하고 약간 다른 경로로 이동해야합니다.
만약 내가 당신이라면, 트랙이 처음에 정렬되고 (보통 비교할 때 사용되는 정렬 방식으로 정렬되도록), 각각의 목록에 대해 Db 바운드가 아닌 것으로 가정하여 쿼리를 작성합니다.
그런 다음 열거자를 사용하여 병렬로 열거하고 해당 링크와 같은 다른 프로세스를 비교합니다.
그럴 가능성이 가장 높습니다.
데이터베이스에서 오는 경우 '원본'에서 최적화합니다. 즉, 가능한 한 많이 정렬되고 필터링 된 데이터를 가져옵니다. 기본적으로 SQL을 먼저 작성하거나 linq 쿼리에서 반환 된 SQL을 검사합니다 (링크가 필요한 경우 알려주십시오).

관련 문제