2014-04-15 2 views
5

Enumerable.SequenceEqual은 왜 비교자를 IEqualityComparer으로 사용합니까? 이 알고리즘은 GetHashCode을 사용하지 않는 것 같습니다. 이 Func<TSource, bool> 인 방법과 비슷한 이유는 대신 Func<TSource, TSource, bool>이라는 조건자를 사용하지 않는 이유는 무엇입니까?SequenceEqual이 술어가 아닌 IEqualityComparer를 사용하는 이유는 무엇입니까?

+0

주제없는 IMO는 아래 내 의견을 참조하십시오. –

답변

1

.NET 코어가 오픈 소스이기 때문에 나는이 질문을 GitHub에 issue으로 게시했습니다. 바라건대, 그 대답이나 개선으로 번역됩니다. -


업데이트 GitHub의 문제에서 가져온 기존의 디자인과 그 문제에 대한 가능한 근거에 관한 자세한 사항은 : 그 이름에도 불구하고,

IEqualityComparer 정말 두 가지 작업을 수행하기위한 및 검사를 해시 평등. Func<TSource, TSource, bool>IEqualityComparer 사이의 유일한 동작 차이는 IEqualityComparerGetHashCode 메서드를가집니다. 모두 을 수행하려면 IEqualityComparer을 사용하여 해시 코드를 작성해야합니다 (잘 수행하는 것이 까다로울 수 있음). 그러나 사용하지 못할 수도 있습니다. SequenceEqual은 그것을 사용하지 않을 것이라고 문서하지 않으므로 이 사용되지 않습니다.

종종, 당신은 SequenceEqual 비교 유형은 해시 된 용기에 보관 될 수 있도록 하나 이상의 IEqualityComparer 동반자 유형이 일어날 것입니다. 아마, 그 이유는 IEqualityComparer 이 매개 변수로 선택되었습니다. 그러나 번이없고 IEqualityComparer이없고 해시가 없다면 요구 사항이 많습니다. 이러한 경우 클래스를 생성하고 구현하는 데 GetHashCode을 쓰는 것은 낭비입니다.

1

"이유"라고 말하고 싶습니다.

다른 유사한 방법 (예 : Enumerable.Distinct)을 살펴보면 과부하 상태 인 경우 IEqualityComparer이됩니다.

또한 IEqualityComparer은 개체가 동일한 지 확인하는 "올바른"방법입니다. A Func<TSource, TSource, bool>은 동등성을 반드시 확인하지는 않지만, 현재이 순간에 개체가 특정 용도에 충분히 유사한 지 확인합니다.

다행히도 자신의 확장 방법을 만드는 것은 쉽습니다. 예를 들어, MoreLinq은 당신이 볼 수있는 DistinctBy의 구현을 가지고 있습니다.

+0

'Distinct'는'GetHashCode'를 필요로하므로 다 대다 비교를하기위한 해쉬 테이블을 만들 수 있습니다. IEqualityComparer를 사용하는 다른 메소드도 비슷합니다. 'SequenceEqual'은 해시 테이블을 필요로하지 않는 단순한 선형 연산이라는 점에서 "별개"입니다 :-). –

+0

나는 평등과 동등한 사이에 실제 차이가 있다고 생각하지 않는다. –

+0

나는 정중하게 동의하지 않는다. SequenceEqual 두 enumerables는 같은 길이이고, enumerables의 객체는 같은 순서로 있고, 그것들은 동일하다. 평등을 확인하는 "적절한"방법은 동등성 컴퍼러입니다. "적절한 평등"에 대해 신경 쓰지 않는다면 Enumerable.SequenceEnal 두 개의 열거 형을 비교할 "무언가"를 선택하는 두 개의 Func (T는 하나, S는 하나)을 전달할 수 있습니다. 이제 다른 유형의 열거 형이 "충분히 동등한 지"를 확인할 수도 있습니다. – aanund