Ho bisogno di eseguire l'hash su una variabile membro invece della classe, quindi non controllo se il riferimento è nel dizionario. Senza sovrascrivere i valori predefiniti, non troverà un identico Value
, ma restituirà solo se trova la stessa identica istanza di HashedType
, in modo tale che questo codice non riesca.Vantaggio di derivare la classe esterna da IEqualityComparer <> override di GetHashCode e uguale a
Dictionary.Add(new HashedType(4));
Dictionary.Contains(new HashedType(4)); // fails to find 4
Definizione HashedType:
HashedType
{
public HashedType(Int32 value) { Value = value); }
public HashedType(String value) { Value = value); }
public object Value;
public void Serialize(Serializer s)
{
if (Value.GetType() == typeof(Int32))
{
s.Set<Int32>(0);
s.Set<Int32>(Value);
}
else
{
s.Set<Int32>(1);
s.Set<String>(Value);
}
}
}
Sembra che posso ignorare GetHashCode() e Equals() per fare questo per me.
Tuttavia, MSDN consiglia di creare una classe separata derivata da IEqualityComparer e di istanziare i miei dizionari utilizzati HashedType con HashedTypeComparer: IEqualityComparer.
per contribuire a rendere questo più facile, ho derivato da dizionario e creato
HashedTypeDictionary<U> : Dictionary<T,U>
{
public HashedTypeDictionary() : base(new HashedTypeComparer()) { }
public bool Equals(HashedType a, HashedType b) { return a.Value == b.Value; }
publci int GetHashCode(HashedType a) { return a.Value.GetHashCode(); }
}
tutto questo sembra artificioso.
L'unico vantaggio che ottengo non è la modifica di Equals()?
Voglio dire, davvero parlando, vorrei uguagliare confrontare uguali contro quel singolo membro.