Foreach循环没有在带有List<>的c#中完成

时间:2013-03-02 02:49:23

标签: c# list foreach

我知道这很奇怪,但我找不到另一种说法。请看下面的图片 count list

enter image description here

输出为1并且始终相同!

我真的不明白这里发生了什么。有谁可以向我解释一下?

5 个答案:

答案 0 :(得分: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方法将两个对象定义为相同。
  3. 您是否将Medicion0对象设置在任何地方?如果没有,他们可能都是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;
    }
}