Реализация GetHashCode в классе значений - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть класс Money, и я хочу знать, как лучше всего реализовать GetHashCode для этого класса значений: $ 1! = € 1.Взвешенное значение по отношению к валюте * значение не будет работать.

public class Money : System.IEquatable<Money>
{       
    public Money(Currency c, decimal val)
    {
        this.Currency = c;
        this.Value = val;
    }

    public Currency Currency
    {
      get; 
      protected set; 
    }

    public decimal Value 
    { 
      get; 
      protected set; 
    }

    public override bool Equals(object obj)
    {
        Money m = obj as Money;

        if (m == null){throw new System.ArgumentNullException("m");}

        if(m.Currency.Id == this.Currency.Id)
        {
            if(m.Value == this.Value)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }

    public override int GetHashCode()
    {
        // What would be the best way of implementing this as €1 != $1
        // Currency object contains 2 members, (int) Id and (string) symbol
    }
}

1 Ответ

0 голосов
/ 15 февраля 2012

Поскольку Currency.Id кажется уникальным, при условии, что оно ненулевое integer, я бы выбрал

public override int GetHashCode()
{
    unchecked
    {
        return (Currency.Id*397) ^ Value.GetHashCode();
    }
}

Было бы Currency.Id непустым string или Guid, следующее сделает трюк

public override int GetHashCode()
{
    unchecked
    {
        return (Currency.Id.GetHashCode()*397) ^ Value.GetHashCode();
    }
}
...