Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我字典里的问题<;双除法>;未使用公共类divia:IEquatable的已实现Equals(divia obj)<;Divisa>;_C#_.net_Dictionary - Fatal编程技术网

C# 我字典里的问题<;双除法>;未使用公共类divia:IEquatable的已实现Equals(divia obj)<;Divisa>;

C# 我字典里的问题<;双除法>;未使用公共类divia:IEquatable的已实现Equals(divia obj)<;Divisa>;,c#,.net,dictionary,C#,.net,Dictionary,我有一个叫做Divisa的类,它扩展了IEquatable。这个类只得到一个字符串类型的字段,所以在我的实现中,只需比较这个字符串就可以了 重点是:我有另一个类,它包含一个单词,当我试图找到一个存储的键时,它告诉我它不存在 以下是签证代码: public class ConversorDivisas { private Divisa divisaBase; private Dictionary<Divisa, double> ratiosDeCadaDivisaRes

我有一个叫做Divisa的类,它扩展了IEquatable。这个类只得到一个字符串类型的字段,所以在我的实现中,只需比较这个字符串就可以了

重点是:我有另一个类,它包含一个单词,当我试图找到一个存储的键时,它告诉我它不存在

以下是签证代码:

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中实现IEqualityComparator并重写gethashcode

我期待着很快收到你的来信

致以最良好的祝愿, 水骑士

如果您更改

.ContainsKey(new Divisa("Libra"))

你的代码可以工作。您当前正在创建类Divisa的新对象实例,该实例显然不在字典中。通过将其更改为传入已创建对象的实际实例,您将找到它

希望这能进一步帮助你

干杯


此外,我还建议您开始使用语言功能“auto property”。此代码示例可以重写为:

private Divisa divisaBase;
public Divisa DivisaBase
{
    get
    {
       return this.divisaBase;
    }
}
以下是:

public Divisa DivisaBase { get; private set; }

这使您的源代码更短,更易于阅读。

您还没有完成实现
IEquatable

有一项附加要求:

如果实现
IEquatable
,还应该重写
Equals(Object)
GetHashCode()
的基类实现,以便它们的行为与
Equals(T)
方法的行为一致


如果您跳过这一步,您将遇到不当行为。

Hi@WaterKnight,欢迎来到StackOverflow!请您发布ConversOrdVisas类的源代码好吗?@GabrielRainha我更新了帖子并添加了ConversOrdVisas的代码。您确实需要覆盖
GetHashCode()
,不知道您是从哪里想到
EqualityComparer.Default
在没有它的情况下可以工作的。我知道这会解决问题,但我希望.ContainsKey(新天秤座)返回真值。我希望得到与Java中映射相同的结果,其键是一个重新定义了equals的对象,因此它不只是比较对象的引用。如果两个对象具有相同的字符串属性,我想返回true。ContainsKey(新设计(“天秤座”)在这个星座中不会返回true。您可以做的是将字典的键更改为字符串(例如Libra、Dólar、Euro等)。我认为我可以得到与java相同的结果。我理解您的意思,但我没有完全看到基于包含字符串的对象创建集合索引的好处。然后在基于键查询集合以实例化完整的新对象时,我们需要精心设计此练习,将来可能会扩展divisa的属性,但保持其名称的相等。我已经阅读了文档,但是它说如果你扩展了IEquatable,你应该实现这两个方法,而不是IEquatable。也许我有点误解了。我的Divisa类得到我期望的结果的正确实现是什么。@沃特奈特:我不知道文档中的哪一行让你这么想,但我引用的部分是“也”--很清楚你两者都做。那么,什么是hashcode的好实现呢,所以我得到了我期望的结果?如果它只有一个字符串,那么使用该字符串的哈希代码。
private Divisa divisaBase;
public Divisa DivisaBase
{
    get
    {
       return this.divisaBase;
    }
}
public Divisa DivisaBase { get; private set; }