Foreach循环没有完成在C#与列表<>
刚您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
。 - 如果
Id
都相同,则Equals
方法将两个对象定义为相同。
您是否在任何地方设置了Medicion
对象的Id
?如果不是,他们很可能都是0
。如果所有ID都相同,这会使所有对象看起来相同(您的相等定义基于Id
)。
因此,在添加第一个对象后,Mediciones.Contains
将始终为true
。您不提供任何有关Mediciones
的信息,但我在这里假定它是没有覆盖的标准List
。
其中一个intellisense对话框向您展示了TodasMediciones。另一个是向你展示医药。这些价值不尽相同。
见Modify List.Contains behavior
你会想在你Medicion
实施IEquatable<T>
。
好的调用,但你会认为默认实现会使用引用比较,因此对于列表中的四个不同对象的每一个,都会在循环中触发“if”条件四次。 – 2013-03-02 03:01:03
@MichaelPetrotta我很确定默认的'List
好吧,将引用复制到对象。它不做深层复制。他从TodasMediciones添加到'Mediciones'中有四个对象。我认为'Contains'会为每个新项目返回false。 – 2013-03-02 03:11:17
我不明白你的问题是什么。循环在TodasMediciones上循环,这是一个List。第二个调试器在Mediciones上。两者都是不同的对象。
第二张图片显示“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;
}
}
'TodasMediciones'包含4个相同的值吗? – JLRishe 2013-03-02 02:55:11
'Mediciones'类型是什么?为什么你认为foreach循环没有完成?使用调试器来逐步执行循环。特别是,看看是否在每次循环迭代中触发if条件。 – 2013-03-02 02:56:43
在循环结束时向控制台输出一个像“循环终止”这样的语句。这是测试循环是否结束的最简单方法。 – Nabou 2013-03-02 03:03:41