사전에서 키로 사용되는 사용자 정의 클래스이지만 키를 찾을 수 없습니다.
-
06-07-2019 - |
문제
나는 수업을 가지고 있습니다. 아래는 아래에 표시됩니다. 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를 무시하고 키 조회가 잘 작동했습니다.