2013-04-15 1 views
0

현재 containskey 메서드를 사용하여 사전에 사용자 지정 형식의 특정 키가 있는지 확인하려고합니다. 이렇게하려면 내가 가진 gethashcode 함수를 재정의해야합니다. 그러나 containskey 메서드는 여전히 작동하지 않습니다. 내가 원하는 내가 사전 (트리거 상태)가 :이 내가 잘 수 없어요 것이어야하지만 난 정확히 지난 5 시간 전이 시도하고 무엇을 알아 냈 havent 한 : 추가 설명을 위해containskey 및 gethashcode 문제

public class Parameter : IEquatable<Parameter> 
{ 
    public string Field { get; set; } 
    public string Content { get; set; } 

    public bool Equals(Parameter other) 
    { 
     if (other == null) 
     { 
      return false; 
     } 

     return Field.Equals(other.Field) && Content.Equals(other.Content); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      int hash = 17; 
      hash = hash * 23 + Field.GetHashCode(); 
      hash = hash * 23 + Content.GetHashCode(); 
      return hash; 
     } 
    } 
} 

public class Trigger : IEquatable<Trigger> 
{ 
    public Dictionary<int, Parameter> Parameters { get; private set; } 
    private string Event { get; set; } 

    public bool Equals(Trigger item) 
    { 
     if (item == null) 
     { 
      return false; 
     } 

     return Event.Equals(item.Event) && Parameters.Equals(item.Parameters); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      var hash = 17; 
      hash = hash * 23 + Parameters.GetHashCode(); 
      hash = hash * 23 + Event.GetHashCode(); 
      return hash; 
     } 
    } 
} 

을 모든 하위 클래스가 equatable인지 확인한 경우에만 containsKey 메서드를 사용할 수 있지만 가정용 키를 확인하는 것은 아닙니다.

편집 :

public override bool Equals(object o) 
{ 
    var item = o as Trigger; 
    if (item == null) 
    { 
     return false; 
    } 

return Event.Equals(item.Event) && Dictionaries.Equals(Parameters, item.Parameters); 
} 

public override int GetHashCode() 
{ 
    var hash = 17; 
    hash = hash * 23 + Dictionaries.GetHashCode(Parameters); 
    hash = hash * 23 + Event.GetHashCode(); 
    return hash; 
} 
+1

코드에서 사용자 정의 유형이 키로 사용되는 것을 볼 수 없습니다. int를 키로 사용하고 있습니다. 문제가있는 코드를 보여줘야합니다. – Stewart

+0

나는 이것을 확인하고있는 Dictionary 를 가지고있다. 상태가 또 다른 사용자 정의 클래스입니다.하지만이 질문에 중요하지 않습니다. –

답변

4

Dictionary<,> 자체가 EqualsGetHashCode가 오버라이드 (override)하지 않는 - 그래서 당신의 Trigger 구현이 끊어집니다 : 무엇 내가 지금했던 것은 존 소총의 사전 클래스를 구현하고 내 검사를 수행하려면이 옵션을 사용합니다. 당신이 원하는 평등을 찾아 내서 직접 구현해야합니다.

나는보고 싶은 사람이 sample implementation in protobuf-csharp-port입니다.

편집 : 변경 사항이 여전히 올바르지 않습니다. 이 같은 평등을 구현해야합니다 :

return Event.Equals(item.Event) && 
     Dictionaries.Equals(Parameters, item.Parameters); 

GetHashCode으로 구현 : 대신 autoproperty를 사용

Dictionary<TKey, TValue>(IDictionary<TKey, TValue>, IEqualityComparer<TKey>) 

백업 필드를 사용 : 당신은 오버로드 된 생성자를 사용한다

var hash = 17; 
hash = hash * 23 + Dictionaries.GetHashCode(Parameters); 
hash = hash * 23 + Event.GetHashCode(); 
return hash; 
+0

이 말은 실제로 무슨 뜻인지 알지 못합니다. gethashcode에 대한 자체 재정의와 내 기본 객체에 대한 equals를 이미 구현 했으므로 잘못된 작업을 수행하고 있습니까? –

+0

@KendeJong : 당신의 구현물을 보라. - 당신은'Parameters.Equals'와'Parameters.GetHashCode'를 호출하고 있고, 그것들은 Dictionary에서 오버라이드되지 않습니다. –

+0

그래서 만약 내가 제대로 이해, 나는 "표준"사전의 equals 및 gethashcodes에 대한 재정의를 구현해야합니까? –