我已經構建了下面的簡單示例來說明我在我的實際代碼中所遇到的問題,它比較複雜。列表中每個迭代覆蓋列表中的對象屬性
首先,我簡單的類:
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循環的每次迭代中的所有對象的深層副本。 –