사전에서 키로 사용되는 사용자 정의 클래스이지만 키를 찾을 수 없습니다.

StackOverflow https://stackoverflow.com/questions/1632768

문제

나는 수업을 가지고 있습니다. 아래는 아래에 표시됩니다. Dictionary<ValuesAandB, string>이 사전 내에서 어떤 키를 찾으려고 노력할 때 문제가 발생했는데 전혀 찾지 못합니다. 보시다시피, 나는 무시했다 Equals 그리고 GetHashCode.

내가 사용하는 키를 찾기 위해

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();
      }
   }
}

그리고 누군가가 묻기 전에, 값은 사전에 있습니다!

도움이 되었습니까?

해결책

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

다른 팁

당신은 평등과 gethashcode를 재정의하지 않았습니다. 당신은 평등을 사용하는 두 번째 클래스를 구현했습니다. 평등을 사용하여 사전을 구성하지 않으면 사용되지 않습니다.

가장 간단한 수정은 비교를 구현하는 대신 gethashcode를 재정의하는 것입니다 (비교기는 일반적으로 여러 가지 다른 비교 유형을 제공해야 할 때만 흥미 롭거나 비교를 수행 할 수 있어야 할 때만 흥미 롭습니다. 당신이 통제하지 않는 수업에서.

두 줄을 비교하는 것처럼 보입니다. IIRC, .quals ()를 사용할 때는 실제 내용이 아닌 문자열의 참조를 비교합니다. 문자열과 함께 작동하는 평등을 구현하려면 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
}

나는 코드를 조금 벗어날 수 있습니다.

나는이 문제가 있었고, 사전이 객체의 값이 아니라 내 키에 대한 언급을 비교하고 있음을 밝혀 냈습니다.

커스텀 포인트 클래스를 키로 사용하고있었습니다. ToString ()와 gethashcode () 메소드와 Viola를 무시하고 키 조회가 잘 작동했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top