0

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

ここに画像の説明を入力

出力は 1 で、常に同じです!

ここで何が起こったのか本当にわかりません。誰か私に説明できますか?

4

5 に答える 5

1

あなたModeloMedicionクラスに関するいくつかの観察:

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> {...}
  1. Idメンバーは として定義されますprotected set
  2. このEqualsメソッドはId、両方の が同じである場合、2 つのオブジェクトを同じものとして定義します。

オブジェクトの をどこかに設定していIdますか? Medicionそうでない場合、それらはすべて である可能性があります0。すべての Id が同じ場合、これによりすべてのオブジェクトが同じように見えます (等値の定義は に基づいていますId)。

したがって、Mediciones.Contains常にtrue最初のオブジェクトが追加された後になります。に関する情報は提供していませんが、ここではオーバーライドのないMediciones標準であると想定しています。List

于 2013-03-02T15:30:00.163 に答える
0

これらの IntelliSense ダイアログの 1 つは、TodasMediciones を示しています。もう 1 つは Mediciones を示しています。これらは同じ値ではありません。

于 2013-03-02T02:51:48.583 に答える
0

まあ、私は間違っています。問題は (理由はわかりません) です!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;
    }
}
于 2013-03-02T13:08:50.487 に答える