2016-11-15 3 views
-2

해시 코드 문제처럼 보이고 자신의 평등 논리를 구현하는 것이 실패로 끝났지 만 이에 대한 확실한 답을 찾지 못하는 것 같습니다.일반 콜렉션으로 GetHashCode가 다른 값을 반환합니다.

MSDN documentation에서 제안한대로 Equals, GetHashCode, == 및! =을 재정의하는 사용자 지정 개체 (Step)가 있습니다. 이 객체 자체는 잘 작동합니다. 단계를 단계를 비교할 때, 평등 연산자는 예상대로 작동합니다. 평등에 의거하여 참조 평등이 아니라 Step의 속성 값을 나타냅니다.

나는 Step 개체를 일반 목록에 저장하는 두 번째 개체 (Steps)가 있습니다. 이제 Step 객체 목록이 Step 객체의 다른 목록과 같은지보고 싶습니다. Steps 객체에서 나는 Step에서했던 것처럼 다양한 메소드와 연산자를 오버라이드합니다. GetHashCode 재정의의 경우 단계 목록을 반복하고 해시 코드를 결합합니다.

foreach(var step in steplist.Steps) 
{ 
    hash += step.GetHashCode() 
} 
return hash 

Simple. 그러나 그것은 효과가 없습니다. 동일한 Step 오브젝트 값을 갖는 두 개의 개별 목록에 대한 해시 코드는 다른 해시 코드를 리턴합니다. 해시 코드를 올바르게 구현하지 않는다고 가정합니다.

저는 반환 해시 코드를 0으로 하드 코딩하여 하루로 전화 할 준비가되었습니다. 모든 통찰력이 인정됩니다.

편집 :

미안 해요, 난 텍스트의 벽을 피하기 위해 간단한려고 노력했다. 다음은 Step 객체의 해시 코드 생성입니다. What is the best algorithm for an overridden System.Object.GetHashCode?에서 촬영 : 그 차이를 만드는 경우 옆 지연 및 색인에서 모든 속성, 참조 형식이 아닌 값 형식입니다

public override int GetHashCode() 
{ 
    return new { StepType, Color, Trigger, Delay, Index  }.GetHashCode(); 
} 

참고. 그리고 누군가의 질문에 대답하기 위해서 : 내가 비교하고있는 두 목록은 분명히 같은 참조가 아닙니다. 그들은 두 개의 분리 된 목록입니다. 아마 거기에 내 문제가있다.

+3

아주 작은 코드로만 말하기가 어렵습니다. [mcve]를 입력하십시오. –

+1

두려움을 풀려면 ** 작동해야합니다 **. 따라서 코드에 버그가 있어야합니다. 표시된 작은 코드는 서로 다른 순서로 동일한 객체를 가진 두 개의 목록이 동일한 해시 코드를 생성한다는 것을 나타낼 수 있지만, 다른 경우에는 왜 그런지 또는 특정 경우에 작동하지 않는 이유에 대해 말할 수 없습니다. 분석 할 충분한 코드. [mcve]를 코드가 기대하는 동작과 함께 게시하십시오 (그렇지 않은 경우). –

+0

Step.GetHashCode() 구현을 게시 할 수 있습니까? –

답변

0

당신은 너무 확실히 알고 StepType, ColorTrigger에 대한 GetHashCode()에 대한 코드를 표시해야하지만이 같은 언급은하지 않으며 당신이 그 유형에 대한 GetHashCode()의 기본 구현을 사용하는 경우 다음 다른 참조를 가진 서로 다른 원인 생성 될 해쉬 코드.

관련 문제