prre72
prre72

Reputation: 717

Cannot update a single item (object) in a List C#

I have a list of objects:

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

Now i want to call a Method on the object that modifies its properties:

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

The method is this:

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

This works, but the problem is that when I try to update just the first item of the list:

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

ALL ITEMS OF THE LIST ARE UPDATED!!! I cannot find why all items are updated and not only item 0. Please help this is really an headache

many thanks

class definition:

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

Upvotes: 0

Views: 294

Answers (2)

Scott Chamberlain
Scott Chamberlain

Reputation: 127593

The problem is from this

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

You are passing the same dictionary to both classes, so if you modify one of the classes you modify both instances.

You must create a new dictionary inside the constructor of NPortfolio so each class has a unique copy.

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

This will make a shallow copy of the dictionary and should solve your issue for now.

Upvotes: 1

juharr
juharr

Reputation: 32296

You're passing the same dictionary into your objects. So when you update it in one you end up seeing the changes in the other. You should create a new dictionary inside your constructor and populate it with the values passed in.

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

Upvotes: 0

Related Questions