2009-10-27 6 views
9

아래에 표시된 키가 있습니다. Dictionary<ValuesAandB, string> 이 사전에서 키를 찾으려고 할 때 문제가 있습니다. 찾지 못합니다. 그것은 전혀. 보시다시피, EqualsGetHashCode을 재정의했습니다.사전의 키로 사용되었지만 키를 찾을 수없는 사용자 정의 클래스

는 내가 부족 다른 있나요 내가

ValuesAandB key = new ValuesAandB(A,B); 
if (DictionaryName.ContainsKey(key)) { 
    ... 
} 

사용하고 키를 찾으십시오? 아무도 내가 잘못하고있는 것을 지적 할 수 있습니까?

private class ValuesAandB { 
    public string valueA; 
    public string valueB; 

    // Constructor 
    public ValuesAandB (string valueAIn, string valueBIn) { 
    valueA = valueAIn; 
    valueB = ValueBIn; 
    } 

    public class EqualityComparer : IEqualityComparer<ValuesAandB> { 
     public bool Equals(ValuesAandB x, ValuesAandB y) { 
     return ((x.valueA.Equals(y.valueA)) && (x.valueB.Equals(y.valueB))); 
     } 
     public int GetHashCode(ValuesAandB x) { 
     return x.valueA.GetHashCode()^x.valueB.GetHashCode(); 
     } 
    } 
} 

누구나 물어보기 전에 값은 사전에 있습니다.

답변

9

사전을 어떻게 구성합니까? 사용자 정의 평등 비교자를 생성자에 전달하고 있습니까?

6

당신은 Equals와 GetHashCode를 오버라이드하지 않았습니다. EqualityComparer 역할을 할 수있는 두 번째 클래스를 구현했습니다. EqualityComparer로 Dictionary를 구성하지 않으면이 Dictionary가 사용되지 않습니다.

가장 간단한 해결 방법은 비교자를 구현하는 대신 GetHashCode 및 Equals를 직접 재정의하는 것입니다 (비교기는 일반적으로 여러 가지 다른 비교 유형 (대소 문자를 구분하고 대소 문자를 구별하지 않아야 함)을 제공해야하거나 필요할 때만 흥미 롭습니다

+0

예, 게시판에 달린 의견과 답은 밝혀졌지만 Greg Beech는 앞서 당신을 압도했습니다. 도움을 주셔서 감사합니다. –

1

두 문자열을 비교하는 것처럼 보입니다 .Equals()를 사용하면 실제 내용이 아닌 문자열 참조를 비교하고있는 것입니다. 문자열과 함께 작동하는 EqualityComparer를 구현하려면 String.Compare() 메서드를 사용하는 것이 좋습니다.

public class EqualityComparer : IEqualityComparer<ValuesAandB> 
{ 
    public bool Equals(ValuesAandB x, ValuesAandB y) 
    { 
      return ((String.Compare(x.valueA,y.valueA) == 0) && 
      (String.Compare(x.valueB, y.valueB) == 0)); 
    } 
    // gethashcode stuff here 
} 

나는 코드가 떨어져서 당신을 가까이에 가져올 수있다 ...

+0

아니요, String.Equals (String)은 여기에서 호출되는 오버로드로, 내용을 명시 적으로 비교합니다. 그리고 어떤 경우에도 String.Equals (Object)는 동일한 작업을 수행하도록 재정의됩니다. –

+0

* facepalm * 내가 뭘 생각하는지 잘 모르겠다. – cloggins

0

나는이 문제가 있었는데, 사전은 내 키에 대한 참조가 아니라 객체의 값을 비교하고 있었다.

키로 사용자 지정 Point 클래스를 사용하고있었습니다. 나는 ToString()과 GetHashCode() 메소드를 오버라이드하고 비올라는 주요 조회가 잘 동작했다.