不能在c#列表中更新单个项(对象)

本文关键字:单个项 对象 更新 列表 不能 | 更新日期: 2023-09-27 18:17:29

我有一个对象列表:

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

不能在c#列表中更新单个项(对象)

问题出在这里

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

这将创建一个浅层的字典副本,现在应该可以解决您的问题。

您正在向对象传递相同的字典。所以当你在一个中更新它时,你最终会看到另一个中的变化。您应该在构造函数中创建一个新字典,并用传入的值填充它。

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