将列表复制到另一个列表(新列表不应引用旧列表)

时间:2012-12-07 06:26:45

标签: c#

  

可能重复:
  How do I clone a generic list in C#?

我想在C#中将列表复制到另一个列表。问题是像copyto这样的现有方法会从另一个列表中创建一个新列表。但是,如果我对新列表进行一些更改,旧列表也会发生变化。它因为它们的引用类型行为。如果有任何方法(除了foreach循环)从另一个列表创建一个新列表,它不会引用同一个对象

1 个答案:

答案 0 :(得分:16)

所以你想要的是列表的深层副本 - 第二个列表包含第一个列表元素的副本。在这种情况下,当任何列表的元素发生变化时,另一个列表保持不变。

如何做到这一点取决于列表中的元素是引用类型还是值类型。值类型列表可以像这样轻松克隆:

List<int> deepCopy = new List<int>(originalList);

对于引用类型列表,您可以使用序列化,如下所示:

public List<MyObject> DeepCopy()
{
    MemoryStream ms = new MemoryStream();
    BinaryFormatter bf = new BinaryFormatter();
    bf.Serialize(ms, this);

    ms.Position = 0;
    return (List<MyObject>) bf.Deserialize(ms);
}