回答
剛您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;
}
}
- 1. Foreach循環來完成表列
- 2. c#list <t>;如何添加像foreach循環但沒有foreach的對象?
- 3. 的foreach在列表<object>在c#
- 4. PHP循環沒有完成?
- 5. 爲什麼列表<T> .ForEach()實現for循環?
- 6. 將與foreach循環C#的多陣列
- 7. php - > foreach循環
- 8. 動態PHP列表與foreach循環
- 9. 更新在一個std每個值::列表與foreach循環C++
- 10. jsRender循環列表<string>
- 11. 性能for/while循環VS名單上foreach循環<T>
- 12. C#foreach循環
- 13. 與foreach循環
- 14. 將列表<int>轉換成列表<float>? C#
- 15. 國家列表:Foreach循環
- 16. 列表框foreach循環
- 17. 列表<>與多個列表C#
- 18. 模式匹配後在foreach循環中填充列表<T>
- 19. 如何在使用匿名代理時退出列表<string> .ForEach循環?
- 20. Python/Tkinter:循環迭代沒有完成
- 21. For循環內沒有完成Promise
- 22. 窗戶一批循環沒有完成
- 23. 循環沒有完成它的任務
- 24. 的Python沒有完成for循環
- 25. 無法通過列表循環<set <pair >>
- 26. 在C中使用'foreach'循環與stringArray#
- 27. 何時使用List <T> .ForEach通過本地foreach循環?
- 28. Foreach循環在LINQ在C#
- 29. Scala列表foreach,在foreach循環中更新列表
- 30. 如何foreach循環轉換成用於循環在c#
'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