とても奇妙だとは思いますが、他の言い方が見つかりません。下の画像をご覧ください


出力は 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、両方の が同じである場合、2 つのオブジェクトを同じものとして定義します。オブジェクトの をどこかに設定していIdますか? Medicionそうでない場合、それらはすべて である可能性があります0。すべての Id が同じ場合、これによりすべてのオブジェクトが同じように見えます (等値の定義は に基づいていますId)。
したがって、Mediciones.Contains常にtrue最初のオブジェクトが追加された後になります。に関する情報は提供していませんが、ここではオーバーライドのないMediciones標準であると想定しています。List
これらの IntelliSense ダイアログの 1 つは、TodasMediciones を示しています。もう 1 つは Mediciones を示しています。これらは同じ値ではありません。
まあ、私は間違っています。問題は (理由はわかりません) です!Mediciones.Contains(m)。最初は false で、次の反復では true です。私は次のようにメソッドを変更します
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
-------------------------------------------
メディシオンの定義は次のとおりです。
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;
}
}