c# - 我的字典中的问题不使用公共类 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。
我期待着尽快收到您的来信。
最好的问候,水骑士
解决方案
你还没有完成实施IEquatable<T>
。
该文件有一个额外的要求:
如果您实现
IEquatable<T>
,您还应该覆盖 和 的基类实现,Equals(Object)
以便GetHashCode()
它们的行为与Equals(T)
方法的行为一致。
如果您跳过此步骤,您将遇到不当行为。
推荐阅读
- spring - 在spring mvc+spring security+spring session redis web应用中同时使用WebApplicationInitializer和web.xml
- google-apps-script - 加载 Google App 脚本库时出现问题 - 出现未知函数错误
- mysql - 如何防止 mySQL 自动增量在 Django 中重置
- reactjs - 如何根据数组内对象的属性返回元素
- multithreading - 如何在后台加载资源?
- r - 在R中提取带有上下文的字符串
- c# - 将 jQuery JSON 对象保存到 SQL 表中,而无需在 MVC ASP.NET Core 中创建视图模型类
- javascript - 我想使用按钮更改我的 UL 中的某些名称
- c++ - gcc在其所在目录下找不到libcurl头文件
- c# - C# - 在多行文本框上绘制网格线