とても奇妙だとは思いますが、他の言い方が見つかりません。下の画像をご覧ください
出力は 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;
}
}