首页 > 解决方案 > 我的字典中的问题不使用公共类 Divisa:IEquatable 的已实现 Equals(Divisa obj)

问题描述

我有一个名为 Divisa 的类,它扩展了 IEquatable。这个类只是得到了一个字符串类型的字段,所以在我实现的 IEquatable y 的 Equals 中只比较那个字符串。

关键是:我有另一个类,其中包含 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();

我已经说过你不需要在divisa中实现IEqualityComparator并覆盖gethashcode。

在此处输入图像描述

我期待着尽快收到您的来信。

最好的问候,水骑士

标签: c#.netdictionary

解决方案


你还没有完成实施IEquatable<T>

该文件有一个额外的要求:

如果您实现IEquatable<T>,您还应该覆盖 和 的基类实现,Equals(Object)以便GetHashCode()它们的行为与Equals(T)方法的行为一致。

如果您跳过此步骤,您将遇到不当行为。


推荐阅读