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相同。

你在任何地方设置Id你的Medicion对象吗?如果不是,它们很可能都是0. 如果所有 Id 都相同,这会使您的所有对象看起来都相同(您的相等定义基于Id)。

因此,Mediciones.Contains将始终true在添加第一个对象之后。您没有提供关于 的任何信息Mediciones,但我在这里假设它是一个List没有覆盖的标准。

于 2013-03-02T15:30:00.163 回答
0

其中一个智能感知对话框正在向您展示 TodasMediciones。另一个是向您展示Mediciones。这些不是相同的值。

于 2013-03-02T02:51:48.583 回答
0

请参阅修改 List.Contains 行为

您将要IEquatable<T>在您的Medicion.

于 2013-03-02T02:56:39.590 回答
0

我不明白你的问题是什么。TodasMediciones 上的循环是一个列表。第二个调试器在 Mediciones 上。两者是不同的对象。

于 2013-03-02T02:57:18.617 回答
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;
    }
}
于 2013-03-02T13:08:50.487 回答