2013-03-02 32 views
0

我知道這很奇怪,但我沒有找到另一種方式說出來。請參考下面 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

回答

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. 如果Id都相同,則Equals方法將兩個對象定義爲相同。

您是否在任何地方設置了Medicion對象的Id?如果不是,他們很可能都是0。如果所有ID都相同,這會使所有對象看起來相同(您的相等定義基於Id)。

因此,在添加第一個對象後,Mediciones.Contains將始終爲true。您不提供任何有關Mediciones的信息,但我在這裏假定它是沒有覆蓋的標準List

0

其中一個intellisense對話框向您展示了TodasMediciones。另一個是向你展示醫藥。這些價值不盡相同。

0

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

0

我不明白你的問題是什麼。循環在TodasMediciones上循環,這是一個List。第二個調試器在Mediciones上。兩者都是不同的對象。

+0

第二張圖片顯示「Mediciones」與「TodasMediciones」不同 – 2013-03-02 03:16:30

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; 
    } 
}