回答
剛您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. 比較列表<sting>與foreach循環忽略情況c#
- 2. 打破foreach循環沒有完成
- 3. Foreach循環來完成表列
- 4. 加入兩個列表<T>與foreach循環
- 5. c#list <t>;如何添加像foreach循環但沒有foreach的對象?
- 6. 的foreach在列表<object>在c#
- 7. 是否有一種方便的方式將列表<int?>變成列表<int>而沒有循環?
- 8. PHP循環沒有完成?
- 9. 循環沒有完成
- 10. 重構foreach循環列出<T> .ForEach(...)
- 11. 爲什麼列表<T> .ForEach()實現for循環?
- 12. for循環與列表和子列表foreach循環
- 13. 將與foreach循環C#的多陣列
- 14. Go有沒有foreach循環?
- 15. 的foreach /與列表<T>循環將不會更新正確
- 16. php - > foreach循環
- 17. 下拉列表與foreach循環PHP
- 18. 動態PHP列表與foreach循環
- 19. 更新在一個std每個值::列表與foreach循環C++
- 20. 沒有輸入foreach循環
- 21. jsRender循環列表<string>
- 22. C#讀字典<字符串,列表<String>>使用LINQ或foreach循環
- 23. 性能for/while循環VS名單上foreach循環<T>
- 24. C#foreach循環
- 25. C#foreach循環
- 26. 將列表<int>轉換成列表<float>? C#
- 27. 與foreach循環
- 28. 列表<>與多個列表C#
- 29. 列表框foreach循環
- 30. 國家列表:Foreach循環
'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