我知道这很奇怪,但我找不到另一种说法。请看下面的图片
输出为 1 并且始终相同!
我真的不明白这里发生了什么。谁能给我解释一下?
只是对您Modelo
和Medicion
课程的一些观察:
public class Modelo<T>
{
// 1) note PROTECTED set on Id
public virtual int Id { get; protected set; }
public override bool Equals(object obj)
{
...
// 2) comparison is based on Id
return (this == obj || this.Id == specificOject.Id);
}
...
}
public class Medicion : Modelo<Medicion> {...}
Id
成员定义为protected set
。Equals
方法将两个对象定义为Id
相同。你在任何地方设置Id
你的Medicion
对象吗?如果不是,它们很可能都是0
. 如果所有 Id 都相同,这会使您的所有对象看起来都相同(您的相等定义基于Id
)。
因此,Mediciones.Contains
将始终true
在添加第一个对象之后。您没有提供关于 的任何信息Mediciones
,但我在这里假设它是一个List
没有覆盖的标准。
其中一个智能感知对话框正在向您展示 TodasMediciones。另一个是向您展示Mediciones。这些不是相同的值。
您将要IEquatable<T>
在您的Medicion
.
我不明白你的问题是什么。TodasMediciones 上的循环是一个列表。第二个调试器在 Mediciones 上。两者是不同的对象。
好吧,我错了。问题(我不知道为什么)是!Mediciones.Contains(m)
。第一次是假的,在接下来的迭代中是真的。我改变方法如下
public virtual void AddMediciones(List<Medicion> TodasMediciones)
{
int i = 0;
foreach (Medicion m in TodasMediciones)
{
Console.WriteLine(Mediciones.Contains(m));
Console.WriteLine(m.Valor);
Console.WriteLine("-------------------------------------------");
if (!Mediciones.Contains(m))
{
Mediciones.Add(m);
}
}
}
他们的输出是:
False
1
-------------------------------------------
True
2
-------------------------------------------
True
3
-------------------------------------------
True
4
-------------------------------------------
这是Medicion的定义:
public class Medicion : Modelo<Medicion>
{
public virtual DateTime Fecha { get; set; }
public virtual decimal Valor { get; set; }
public virtual Indicador Indicador { get; set; }
}
}
和他们的父母定义
public class Modelo<T>
{
public virtual int Id { get; protected set; }
public override bool Equals(object obj)
{
if (obj == null || obj.GetType() != this.GetType())
{
return false;
}
Modelo<T> specificOject = (Modelo<T>)obj;
return (this == obj || this.Id == specificOject.Id);
}
public override int GetHashCode()
{
return Id.GetHashCode() ^ 5;
}
}