Проблема в моем словарене использует реализованный Equals (Divisa obj) публичного класса Divisa: IEquatable <Divisa> - PullRequest
0 голосов
/ 11 октября 2018

У меня есть класс под названием Divisa, который расширяет IEquatable.Этот класс просто содержит поле типа string, поэтому в моем реализованном Equals of IEquatable y просто сравните эту строку.

Дело в том, что у меня есть другой класс, который содержит словарь A, когда я пытаюсь найти сохраненный ключ, который сообщаетмне, что это не выходит.

Вот код ConversorDivisas:

public class ConversorDivisas
{
    private Divisa divisaBase;
    private Dictionary<Divisa, double> ratiosDeCadaDivisaRespectoALaBase;

    public ConversorDivisas(Divisa divisaBase)
    {
        this.divisaBase = divisaBase;
        this.ratiosDeCadaDivisaRespectoALaBase = new Dictionary<Divisa, double>();
    }

    public Divisa DivisaBase
    {
        get
        {
            return this.divisaBase;
        }
    }

    public Dictionary<Divisa, double> RatiosDeCadaDivisaRespectoALaBase
    {
        get
        {
            return this.ratiosDeCadaDivisaRespectoALaBase;
        }
        set
        {
            this.ratiosDeCadaDivisaRespectoALaBase = value;
        }
    }

    public Boolean aniadirNuevaDivisa(Divisa divisaAAniadir, double ratio)
    {
        Boolean res = true;
        try
        {
            this.ratiosDeCadaDivisaRespectoALaBase.Add(divisaAAniadir, ratio);
        }
        catch (ArgumentException e)
        {
            res = false;
        }
        return res;
    }

    public Boolean eliminarDivisa(Divisa divisaAEliminar)
    {
        return this.ratiosDeCadaDivisaRespectoALaBase.Remove(divisaAEliminar);
    }

    public Boolean cambiarRatioDivisa(Divisa divisa, double ratio)
    {
        Boolean res = this.ratiosDeCadaDivisaRespectoALaBase.ContainsKey(divisa);
        if (res)
        {
            this.ratiosDeCadaDivisaRespectoALaBase.Remove(divisa);
            this.ratiosDeCadaDivisaRespectoALaBase.Add(divisa, ratio);
        }
        return res;
    }

    public ICollection<Divisa> obtenerTodasLasDivisasQueTieneElConversorDeDivisas()
    {
        return this.ratiosDeCadaDivisaRespectoALaBase.Keys;
    }

    public double cambiarTantaCantidadDeUnaDivisaAOtra(double cantidad, Divisa entrada, Divisa salida)
    {
        double res = 0.0;
        if (entrada.Equals(this.divisaBase)&&entrada.Equals(salida))
        {
            res = cantidad;
        }
        else{
            if (entrada.Equals(this.divisaBase))
            {
                res = cantidad / this.ratiosDeCadaDivisaRespectoALaBase[salida];
            }
            else
            {
                if (salida.Equals(this.divisaBase))
                {
                    res = cantidad * this.ratiosDeCadaDivisaRespectoALaBase[entrada];
                }
                else
                {
                    res = (cantidad * this.ratiosDeCadaDivisaRespectoALaBase[entrada]) / this.ratiosDeCadaDivisaRespectoALaBase[salida];
                }
            }
        }
        return res;
    }

    public Boolean comprobarSiSePuedeCambiarDeUnaDivisaAOtra(Divisa entrada, Divisa salida)
    {
        return (this.divisaBase.Equals(entrada)||this.ratiosDeCadaDivisaRespectoALaBase.ContainsKey(entrada)) && (this.divisaBase.Equals(salida) || this.ratiosDeCadaDivisaRespectoALaBase.ContainsKey(salida));
    }

    public Boolean contieneLaDivisaDada(Divisa divisa)
    {
        return this.ratiosDeCadaDivisaRespectoALaBase.ContainsKey(divisa);
    }
}

Например:

Divisa euro = new Divisa("Euro");
Divisa dolar = new Divisa("Dólar");
Divisa libra = new Divisa("Libra");
Divisa libra1 = new Divisa("Libra");
Divisa yen = new Divisa("Yen");
ConversorDivisas cd = new ConversorDivisas(euro);
cd.aniadirNuevaDivisa(dolar, 0.868614);
cd.aniadirNuevaDivisa(libra, 1.13739);
cd.aniadirNuevaDivisa(yen, 0.00764246);
Console.WriteLine(cd.RatiosDeCadaDivisaRespectoALaBase.ContainsKey(new Divisa("Libra"))); //tells false
Console.ReadLine();

Мне сказали, что вы неМне нужно реализовать IEqualityComparator в divisa и переопределить gethashcode.

введите описание изображения здесь

Я с нетерпением жду вашего ответа в ближайшее время.

BestС уважением, WaterKnight

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы еще не реализовали IEquatable<T>.

В документации есть дополнительное требование:

Если вы внедрите IEquatable<T>, вытакже следует переопределить реализации базового класса Equals(Object) и GetHashCode(), чтобы их поведение соответствовало поведению метода Equals(T).

Если вы пропустите этот шаг, вы столкнетесь спроступок.

0 голосов
/ 11 октября 2018

если вы измените

.ContainsKey(new Divisa("Libra"))

на

.ContainsKey(libra)

ваш код будет работать.В настоящее время вы создаете новый объект-экземпляр вашего класса Divisa, которого явно нет в словаре.Изменяя его, чтобы передать фактический экземпляр уже созданного объекта, вы найдете его.

Надеюсь, это поможет вам в дальнейшем!

Приветствия


Далее я бы также рекомендовал вам начать использовать языковую функцию "auto property".Этот пример кода можно переписать так:

private Divisa divisaBase;
public Divisa DivisaBase
{
    get
    {
       return this.divisaBase;
    }
}

следующее:

public Divisa DivisaBase { get; private set; }

, что делает ваш исходный код короче и легко читаемым.

...