2011-10-05 5 views
4

나는 2 개의 목록을 비교하려고합니다. 나는 다음을 실행하고 나는 false 값이 반환받을 :Linq를 사용하여 2 개의 목록 비교

var areIdentical = list1.SequenceEqual(list2, myFileCompare); 

그 부분은 노력하고 있습니다. 내 목록이 동일하지 않습니다.

var fileDiff = (from file in list1 
       select file).Except(list2, myFileCompare); 

내 문제는, fileDiff 빈 결과 집합을 반환 : 문제는 그 차이를 찾으려고 다음 명령을 사용하고있다. 나는 그들이 동일하지 않다는 것을 알고 있기 때문에, 나는 어떤 것을 돌려 주어야하지 않겠는가? 아마도 내 쿼리가 잘못되었습니다. 어떤 도움을 주시면 감사하겠습니다! 그건 그렇고, 더 많은 코드를 게시 할 수 있습니다. 정말로 필요하다면, 이것으로 충분할 것입니다.

+1

여기서 어떤 차이점이 있습니까? 주문 하시겠습니까? 개체 계속? –

+0

list1과 list2의 내용을 알려 주실 수 있습니까? –

+0

목록에 어떤 유형의 개체가 있습니까? 기본 비교 자 (default comparer)가 자신이 생각하는 것을 수행하고 있습니까? –

답변

6

당신은 아무것도 얻을 수 없겠죠 다음을 사용할 수 있습니다.

var extraItemsInList2 = list2.Except(list1); 
var extraItemsInList1 = list1.Except(list2); 

을 수행하려면 주문에 대해 신경 써야합니다. 정확히 차이점을 표현할 방법을 찾아야합니다. (

var fileDiff = list1.Union(list2).Except(list1.Intersect(list2)); 

또는 : 당신이 symmetric difference 후 경우

+0

나는 그 명령을 정말로 신경 쓰지 않는다. 내가하고있는 일은 디렉토리의 파일들을 비교하는 것이다. 'list1'은 디렉토리 1의 파일 내용이고'list2'는 디렉토리 2의 파일 내용입니다. 참조 용으로 [이 기사] (http://msdn.microsoft.com/en-us/library/bb546137.aspx)를 사용하고 있습니다. – Icemanind

+0

@cemanind : 맞습니다. 그 경우에는 제가 준 코드가 괜찮을 것입니다. –

+0

완벽하게 작동합니다. 고맙습니다! – Icemanind

1

SequenceEqual()은 요소 시퀀스와 요소 시퀀스가 ​​동일한 경우에만 true를 반환합니다.

Except()은 시퀀스가 ​​아닌 요소 만 비교합니다.

귀하의 두 목록에는 분명히 다른 순서가 있지만 게시 한 행동에 따라 두 요소 모두 동일한 요소를 포함하고 있다고 생각합니다.

  • list2list1 모든 것을 포함뿐만 아니라 별도의 항목
  • 이 순서는

당신이 순서에 대해 걱정하지 않는다 가정 달랐다, 다음의 경우

1

다음 계산에 무거운 것이다 다음을 사용할 수 있지만 트릭을 수행해야합니다 (두 목록 사이의 모든 차이, 순서는 중요하지 않습니다)) Jon Skeet's answer에 따라 :

var fileDiff = list1.Except(list2).Union(list2.Except(list1)); 

나는 당신에게 그것을 할 수있는 더 효율적인 방법을 보여주기 위해 지역 사회의 나머지 부분을 떠날거야 ...하지만 내가 생각할 수있는 가장 확실한 "LINQ"방법입니다 of ...

0

SequenceEqual은 시퀀스를 염려하지만 (이름에 암시가 있음)), Except은 그렇지 않습니다.

  • 는 그래서 list2list1, 그러나 다른 순서 동일 요소, ​​아직 너무 SequenceEqual 반환 falseExcept 반환하지 요소를 포함하는 것이 전적으로 가능하다.
  • list2list1의 적절한 수퍼 세트 일 수도 있습니다.이 경우 SequenceEqual은 순서에 관계없이 false을 반환하고, Except은 여전히 ​​요소를 반환하지 않습니다. 당신이 설정 작업을 작업 할 경우

, 당신은 아마 같은 HashSet 또는 SortedSet 직접 일부 세트와 같은 용기를 사용하여 더 나을 수 있습니다. 귀하의 경우에는 HashSet.SetEquals 및/또는 HashSet.ExceptWith에 관심이있을 수 있습니다.

관련 문제