2015-10-12 53 views
0

我有對象的列表:不能更新列表C#中的單個項目(對象)

List<NPortfolio> Portfolios = new List<NPortfolio>(); 
Portfolios.Add(new NPortfolio(1, "1", emptyPositions)); 
Portfolios.Add(new NPortfolio(2, "2", emptyPositions)); 

現在我想調用修改其屬性的對象的一個​​方法:

Portfolios[0].UpdatePositions(db.GetPortfolio(1, Today)); 

的方法是這樣的:

public void UpdatePositions(Dictionary<string, double> valuepairs) 
    { 
     foreach (var k in this.positions.Keys.ToList()) 
     { 
      if (valuepairs.ContainsKey(k)) 
       this.positions[k] = valuepairs[k]; 
     } 
    } 

這工作,但問題是,當我嘗試更新只是列表的第一項:

Portfolios[0].UpdatePositions(db.GetPortfolio(1, Today)); 

該列表的所有項目都已更新! 我找不到爲什麼所有項目更新,不僅項目0 請幫助這真是一個頭痛

千恩萬謝

類定義:

public class NPortfolio 
{ 
    public string p_id { get; set; } 
    public int p_nr { get; set; } 
    private Dictionary<string, double> positions; 
    public NPortfolio(int nr, string id, Dictionary<string, double> pos) 
    { 
     p_nr = nr; 
     p_id = id; 
     positions = pos; 
    } 

    public void UpdatePositions(Dictionary<string, double> valuepairs) 
    { 
     foreach (var k in this.positions.Keys.ToList()) 
     { 
      if (valuepairs.ContainsKey(k)) 
       this.positions[k] = valuepairs[k]; 
     } 
    } 
    public Dictionary<string, double> getPositions() 
    { 
      return positions; 
    } 
} 
+2

你能提供'NPortfolio'的類定義嗎? –

+1

你對位置使用靜態變量嗎? – Domysee

+0

它們是否都共享相同的'Dictionary'實例?而且'ContainsKey'對我來說沒有任何意義。 – kevintjuh93

回答

1

的問題是從這一

Portfolios.Add(new NPortfolio(1, "1", emptyPositions)); 
Portfolios.Add(new NPortfolio(2, "2", emptyPositions)); 

你傳入相同的字典到兩個班,因此,如果您修改其中一個修改兩個實例的類。

您必須在NPortfolio的構造函數中創建一個新字典,以便每個類都有唯一的副本。

public NPortfolio(int nr, string id, Dictionary<string, double> pos) 
{ 
    p_nr = nr; 
    p_id = id; 
    positions = new Dictionary<string, double>(pos); 
} 

這將使字典的shallow copy,並應解決您的問題,現在。

0

你傳遞相同的字典進入你的對象。所以當你更新它時,你會看到另一個的變化。您應該創建一個新的字典的構造函數中,並與傳遞的值來填充它。

public NPortfolio(int nr, string id, Dictionary<string, double> pos) 
{ 
    p_nr = nr; 
    p_id = id; 
    positions = new Dictionary<string, double>(pos); 
}