Foreach循环没有完成在C#与列表<>

问题描述:

我知道这很奇怪,但我没有找到另一种方式说出来。请参考下面 count listForeach循环没有完成在C#与列表<>

enter image description here

输出为1,始终是相同的图像!

我真的不明白这里发生了什么。任何人都可以向我解释?

+1

'TodasMediciones'包含4个相同的值吗? – JLRishe 2013-03-02 02:55:11

+0

'Mediciones'类型是什么?为什么你认为foreach循环没有完成?使用调试器来逐步执行循环。特别是,看看是否在每次循环迭代中触发if条件。 – 2013-03-02 02:56:43

+0

在循环结束时向控制台输出一个像“循环终止”这样的语句。这是测试循环是否结束的最简单方法。 – Nabou 2013-03-02 03:03:41

刚您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. 如果Id都相同,则Equals方法将两个对象定义为相同。

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

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

其中一个intellisense对话框向您展示了TodasMediciones。另一个是向你展示医药。这些价值不尽相同。

Modify List.Contains behavior

你会想在你Medicion实施IEquatable<T>

+0

好的调用,但你会认为默认实现会使用引用比较,因此对于列表中的四个不同对象的每一个,都会在循环中触发“if”条件四次。 – 2013-03-02 03:01:03

+0

@MichaelPetrotta我很确定默认的'List '行为,当你添加一个对象就是复制它。 – Romoku 2013-03-02 03:03:36

+0

好吧,将引用复制到对象。它不做深层复制。他从TodasMediciones添加到'Mediciones'中有四个对象。我认为'Contains'会为每个新项目返回false。 – 2013-03-02 03:11:17

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

+0

第二张图片显示“Mediciones”与“TodasMediciones”不同 – 2013-03-02 03:16:30

我错了。这个问题(我不知道为什么)是!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; 
    } 
}