2009-06-17 3 views
1

2 개의 시퀀스가 ​​있고 각각은 익명 형식을 2 개 필드 (x 및 y라고 함)로 반환합니다. 의미 상으로, x는 이러한 시퀀스의 키와 y 값을 제공합니다.두 Linq 시퀀스를 우선 순위로 병합하십시오.

동일한 x가 양쪽 모두에 나타나면 첫 번째 시퀀스가 ​​두 번째 시퀀스보다 우선 순위가 높다는 것을 어떻게 지정하여 1 시퀀스로 병합 할 수 있습니까?

답변

1

당신은 쉽게 Linq를하지 않고 그것을 할 찾을 수 있습니다, 그러나 나는 이런 식으로 뭔가를 생각하고 있어요 :

var distinctWithPrecedence = seq1 
    .Concat(seq2) 
    .GroupBy(i => i.x) 
    .Select(g => g.First()); 

을 Linq에이 내부적으로 많이로하지 않는 경우. 기본 아이디어는 열쇠로 그룹화됩니다. 그런 다음 각 그룹에서 첫 번째 요소를 끌어 당깁니다. Linq가 어떻게 동작하는지 생각하면 첫 번째 요소가 연결된 목록의 첫 번째 요소가됩니다. 즉, 첫 번째 시퀀스가 ​​선행한다는 의미입니다.

아마도 다른 방법이있을 수 있지만, 마음에 처음 나온 방법입니다.

1

내가

var res = seq1.Union(seq2, Comparer); 

로 시작하는 것이지만, Enumerable.Union에 대한 문서가 당신이 TSource 경우가 없습니다 IEqualityComparer<TSource>의 구현으로 일치하는 요소가 촬영하고 Comparer을 필요로하는 순서에서 지정하지 않은 익명 유형입니다 (하지만이를 허용할만한 가치가있을 수 있음). 그렇지 않으면

당신이 당신 자신의 도우미, 같은 것을 구현해야합니다 :

(당신이 당신의 자신의 종류 (특성 X & y)를 고수 할 경우, 단일 유형의 이상이 제네릭을 만들 수 있습니다 매개 변수를 사용하지만 별도의 속성에 대한 액세스 권한을 부여하려면 형식 제약 조건을 추가해야합니다.

+0

완전성을 위해 'Union' *은 일치하는 요소가있는 경우'first'가 '우선'하도록 지정합니다 'second' : [Union은 * first *와 * second * **를이 순서대로 열거하고 이미 생성되지 않은 각 요소를 산출합니다.] (http://msdn.microsoft .com/ko-us/library/bb341731.aspx) – AakashM

관련 문제