2010-12-20 3 views
10

은 결국 우리가 알고하지 않은 Enumerable.Except 방법에 대해 뭔가 밝혀졌다 우리의 코드에서 버그를 디버깅 시간 이상 소요 데에 대한 자세한 일반적으로Enumerable.Except가 DISTINCT 항목을 반환하는 이유는 무엇입니까?

var ilist = new[] { 1, 1, 1, 1 }; 
var ilist2 = Enumerable.Empty<int>(); 
ilist.Except(ilist2); // returns { 1 } as opposed to { 1, 1, 1, 1 } 

나 :

var ilist3 = new[] { 1 }; 
var ilist4 = new[] { 1, 1, 2, 2, 3 }; 
ilist4.Except(ilist3); // returns { 2, 3 } as opposed to { 2, 2, 3 } 

은 MSDN 페이지에서 상대 :

이 방법은 두 번째에 표시되지 않는 처음에 그 요소를 반환합니다. 또한 은 처음에 나타나지 않는 초에있는 요소를 반환하지 않습니다.

는 그 같은 경우에 그것을 얻을 : 첫 번째 배열의 모든 요소가 두 번째의 '표시'때문에 제거해야하기 때문에

var ilist = new[] { 1, 1, 1, 1 }; 
var ilist2 = new[] { 1 }; 
ilist.Except(ilist2); // returns an empty array 

당신이 빈 상태 (empty)의 배열이.

하지만 왜 우리는 두 번째 배열에 나타나지 않는 다른 모든 항목의 고유 한 인스턴스 만 얻습니까? 이 행동의 근거는 무엇입니까?

+0

:

Set이 같이 설명 버그 또는 의도하지 않은 기능처럼. MSDN 페이지는 별개의 결과가 아니라 ... –

+7

이것은 버그가 아닙니다. 'Except' 메쏘드는 set 연산으로 정의 된 SQL EXCEPT 연산자로 변환되도록되어 있습니다. 집합 연산이므로 고유 한 요소 만 반환됩니다. "뚜렷 함"은 MSDN에서 "용어"를 사용함에 의해 암시됩니다. – Gabe

답변

16

내가 왜 그런 식으로 결정했는지 확실히 말할 수는 없습니다. 그러나 나는 그것을 줄 것이다.

MSDN이되는 경우를 제외하고 설명

값을 비교하는 기본 같음 비교하여 두 시퀀스 세트 차이를 생성. 냄새 세트가 개체로 간주 별개의 개체의 컬렉션은, 그 자체 제 생각에는

+1

+1, 이것은 합리적으로 들립니다. – driis

+2

+1 구현시 O (NxN)에서 O (N)로 문제를 줄이기 위해 해시를 사용합니다. – dthorpe

관련 문제