当我调用此方法时总是更改原始List“printRowList”中的值,我不想更改原始值。我只需要更改临时列表的值“tempRowModellist”。我该怎么办?
private List<PrintRowModel> SetTemplateSettingsData(
List<PrintRowModel> printRowList,
object value)
{
List<PrintRowModel> tempRowModellist = new List<PrintRowModel>();
tempRowModellist.AddRange(printRowList);
foreach (PrintRowModel printRow in tempRowModellist )
{
foreach (PrintColumnModel printColumn in printRow)
{
printColumn.Value =
GetObjectValues(printColumn.Value, value).ToString();
}
}
return newList;
}
答案 0 :(得分:2)
因为您仍在引用原始列表。如果您不想修改它,则需要克隆它。 改变这个
tempRowModellist.AddRange(printRowList);`
作为
tempRowModellist = printRowList.Clone().ToList();
static class Extensions
{
public static List<T> Clone<T>(this List<T> listToClone) where T: ICloneable
{
return listToClone.Select(item => (T)item.Clone()).ToList();
}
}
注意:确保您的班级实现了我Cloneable interface。
答案 1 :(得分:2)
两个列表都存储对相同实际PrintRowModel对象的引用(指针)。如果要创建完全独立的列表,则需要复制列表和列表中存储的对象。
答案 2 :(得分:2)
这是因为添加范围通过引用复制它,因此您可以更改原始对象!
答案 3 :(得分:0)
在此SO question中找出Clone()
方法,此方法将deserialize
原始对象并返回原始对象的副本,这是因为在引用对象中进行更改会影响原始对象。< / p>