Enumerable.SequenceEqual은 왜 비교자를 IEqualityComparer으로 사용합니까? 이 알고리즘은 GetHashCode을 사용하지 않는 것 같습니다. 이 Func<TSource, bool>
인 방법과 비슷한 이유는 대신 Func<TSource, TSource, bool>
이라는 조건자를 사용하지 않는 이유는 무엇입니까?SequenceEqual이 술어가 아닌 IEqualityComparer를 사용하는 이유는 무엇입니까?
답변
.NET 코어가 오픈 소스이기 때문에 나는이 질문을 GitHub에 issue으로 게시했습니다. 바라건대, 그 대답이나 개선으로 번역됩니다. -
업데이트 GitHub의 문제에서 가져온 기존의 디자인과 그 문제에 대한 가능한 근거에 관한 자세한 사항은 : 그 이름에도 불구하고,
IEqualityComparer
정말 두 가지 작업을 수행하기위한 및 검사를 해시 평등.Func<TSource, TSource, bool>
과IEqualityComparer
사이의 유일한 동작 차이는IEqualityComparer
은GetHashCode
메서드를가집니다. 모두 을 수행하려면IEqualityComparer
을 사용하여 해시 코드를 작성해야합니다 (잘 수행하는 것이 까다로울 수 있음). 그러나 사용하지 못할 수도 있습니다.SequenceEqual
은 그것을 사용하지 않을 것이라고 문서하지 않으므로 이 사용되지 않습니다.종종, 당신은
SequenceEqual
비교 유형은 해시 된 용기에 보관 될 수 있도록 하나 이상의IEqualityComparer
동반자 유형이 일어날 것입니다. 아마, 그 이유는IEqualityComparer
이 매개 변수로 선택되었습니다. 그러나 번이없고IEqualityComparer
이없고 해시가 없다면 요구 사항이 많습니다. 이러한 경우 클래스를 생성하고 구현하는 데GetHashCode
을 쓰는 것은 낭비입니다.
"이유"라고 말하고 싶습니다.
다른 유사한 방법 (예 : Enumerable.Distinct)을 살펴보면 과부하 상태 인 경우 IEqualityComparer
이됩니다.
또한 IEqualityComparer
은 개체가 동일한 지 확인하는 "올바른"방법입니다. A Func<TSource, TSource, bool>
은 동등성을 반드시 확인하지는 않지만, 현재이 순간에 개체가 특정 용도에 충분히 유사한 지 확인합니다.
다행히도 자신의 확장 방법을 만드는 것은 쉽습니다. 예를 들어, MoreLinq은 당신이 볼 수있는 DistinctBy
의 구현을 가지고 있습니다.
'Distinct'는'GetHashCode'를 필요로하므로 다 대다 비교를하기위한 해쉬 테이블을 만들 수 있습니다. IEqualityComparer를 사용하는 다른 메소드도 비슷합니다. 'SequenceEqual'은 해시 테이블을 필요로하지 않는 단순한 선형 연산이라는 점에서 "별개"입니다 :-). –
나는 평등과 동등한 사이에 실제 차이가 있다고 생각하지 않는다. –
나는 정중하게 동의하지 않는다. SequenceEqual 두 enumerables는 같은 길이이고, enumerables의 객체는 같은 순서로 있고, 그것들은 동일하다. 평등을 확인하는 "적절한"방법은 동등성 컴퍼러입니다. "적절한 평등"에 대해 신경 쓰지 않는다면 Enumerable.SequenceEnal
주제없는 IMO는 아래 내 의견을 참조하십시오. –