复制列表值

时间:2014-01-02 06:34:24

标签: c#

当我调用此方法时总是更改原始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;
}

4 个答案:

答案 0 :(得分:2)

因为您仍在引用原始列表。如果您不想修改它,则需要克隆它。 改变这个

tempRowModellist.AddRange(printRowList);`

作为

tempRowModellist = printRowList.Clone().ToList();

添加此extension method

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>