我已经构建了下面的简单示例来说明我在我的实际代码中所遇到的问题,它比较复杂。列表中每个迭代覆盖列表中的对象属性
首先,我简单的类:
public class InnerTemp {
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
}
public class OuterTemp {
public List<InnerTemp> InnerTemps { get; set; }
}
和实现:
var outerTemps = new List<OuterTemp>();
var innerTemps = new List<InnerTemp>();
innerTemps.Add(new InnerTemp() { A = 1, B = 2, C = 3 });
innerTemps.Add(new InnerTemp() { A = 4, B = 5, C = 6 });
for(int i = 1; i < 5; i++) {
foreach(InnerTemp innerTemp in innerTemps) {
innerTemp.A += i;
innerTemp.B += i;
innerTemp.C += i;
}
var outerTemp = new OuterTemp()
{
InnerTemps = innerTemps
};
outerTemps.Add(outerTemp);
}
我将在最后一行我的断点,右大括号。按照预期,在第一次迭代中,outerTemps[0].InnerTemps[0].A
的值为2。但是在第二个循环中,outerTemps[0].InnerTemps[0].A
的值变成了4,这让我感到困惑。第一个对象的属性A仅仅因为添加了另一个对象而被踩踏。我完全认为outerTemps[1].InnerTemps[0].A
是不同的,但为什么我的原始财产跺脚?
如何更改此设置,以便每次将新对象添加到集合时都不会覆盖先前的对象属性?
你想要什么'outerTemps [0] .InnerTemps [0] .A'在第二个循环? – IllidanS4
你应该看看[浅vs深层复制](http://stackoverflow.com/questions/184710/what-is-the-difference-between-a-deep-copy-and-a-shallow-copy) 。您正在复制对“innerTemps”的引用,而不是对所有元素进行深层复制。这会导致为每个outerTemp对象修改相同的InnertTemp引用。 –
它很明显,你正在修改每个迭代中的相同列表。您需要创建一个InnerTemp的新列表,其中包含外部for循环的每次迭代中的所有对象的深层副本。 –