我知道这很奇怪,但我找不到另一种说法。请看下面的图片
输出为1并且始终相同!
我真的不明白这里发生了什么。有谁可以向我解释一下?
答案 0 :(得分: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
的任何信息,但我在此假设它是标准的{{1}},没有覆盖。
答案 1 :(得分:0)
其中一个智能感知对话框向您展示了TodasMediciones。另一个向你展示Mediciones。这些价值不一样。
答案 2 :(得分:0)
请参阅Modify List.Contains behavior
您希望在Medicion
中实施IEquatable<T>
。
答案 3 :(得分:0)
我不明白你的问题是什么。循环在TodasMediciones上循环,这是一个List。第二个调试器在Mediciones上。两者都是不同的对象。
答案 4 :(得分:0)
嗯,我错了。问题(我不知道为什么)是!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;
}
}