2016-12-27 2 views
0

두 개의 문자열 목록이 있다고 가정 해 봅시다.두 목록을 비교하고 양쪽에서 차이점을 표시하는 우아한 방법 찾기

List 1 
- Item Abc 
- Item Xyz 
- Item BlahBlah 

List 2 
- Item Abc 
- Item Xyz 
- Item YadiYada 

나는이 같은 경기의 테이블과 경기 실종, 뭔가를 보여주고 싶은 :

List 1   | List 2 
---------------------------------- 
Item Abc  | Item Abc 
Item Xyz  | Item Xyz 
Item BlahBlah | 
       | Item YadiYada 

난이 LINQ로 우아하게 할 수있는 생각,하지만 난 아주 확실하지 않았다 방법 태클해라. 나는 이것에 대한 어떤 방향을 고맙게 생각한다.

+1

필요한 경우 도움을 제공 할 수 있도록 지금까지 시도한 내용을 [mcve]로 입력하십시오. – Nkosi

+1

집합 이론은 어떻습니까? 'union'은'intersect'에 의해'.except()'를 수행합니까? 'intersect'는 당신에게 일치를 줄 것이지만, 그런 접근은 당신에게 모든 불일치를 줄 것입니다. - ((목록 A) U (목록 B)) - ((목록 A) ∩ (목록 B)) –

+0

@BagusTesa, 내가 어디로가는 지 알지만, 다른 목록에 포함되어 있지 않으며 이는 답변의 일부일뿐입니다. 또한 List1에만있는 항목과 List2에만있는 항목이 필요합니다. 이것은 옳은 길에서 나에게 도움이되게했다! – Jiveman

답변

3

이 시도 :

var leftList = new List<string>() { "1", "2", "3" }; 
var rightList = new List<string>() { "2", "3", "4" }; 

var left = leftList.Except(rightList).Select(e => new { L = e, R = string.Empty }); 
var right = rightList.Except(leftList).Select(e => new { L = string.Empty, R = e }); 
var intersection = leftList.Intersect(rightList).Select(e => new {L = e, R = e}); 

var result = intersection.Union(left).Union(right).ToList(); 
+0

아, 알겠습니다. 많은 의미가 있습니다. 나는 이것을 나의 시나리오에 맞추려고 노력할 것이다. – Jiveman

0

그냥 다른 용액 :

var list1 = new List<string> { "Abc", "Xyz", "BlahBlah" }; 
var list2 = new List<string> { "Abc", "Xyz", "YadiYada" }; 

var r1 = list1 
    .GroupJoin(
     list2, 
     l1 => l1, 
     l2 => l2, 
     (l1, l2) => new { l1 = l1, l2 = l2.FirstOrDefault() }); 

var r2 = list2 
    .GroupJoin(
     list1, 
     l2 => l2, 
     l1 => l1, 
     (l2, l1) => new { l1 = l1.FirstOrDefault(), l2 = l2 }); 

var result = r1.Union(r2); 

01,233,407 :

var list1 = new List<string> { "Abc", "Xyz", "BlahBlah" }; 
var list2 = new List<string> { "Abc", "Xyz", "YadiYada" }; 

var r1 = from l1 in list1 
     join l2 in list2 on l1 equals l2 into t 
     from l2 in t.DefaultIfEmpty() 
     select new { l1, l2 }; 

var r2 = from l2 in list2 
     join l1 in list1 on l2 equals l1 into t 
     from l1 in t.DefaultIfEmpty() 
     select new { l1, l2 }; 

var result = r1.Union(r2); 

Left Outer Join

이것은 방법 구문을 이용하여 대안 이 일반적으로 간단하고 읽을 수 있기 때문에 일반적으로

, 우리는 쿼리 구문을 권장; 그러나 메서드 구문과 쿼리 구문 사이에 의미 적 차이가 없습니다. 또한 과 같이 지정된 조건과 일치하는 요소 수를 검색하는 쿼리 또는 소스 시퀀스에서 최대 값을 갖는 요소를 검색하는 쿼리는 메서드 호출로만 표현할 수 있습니다.

+0

LINQ 확장 구문 (람다 식 포함)을 사용하여 어떻게 작성할 수 있습니까? – Jiveman