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

Posted

技术标签:

【中文标题】将列表复制到另一个(新列表不应引用旧列表)[重复]【英文标题】:Copying a list to another (new list should not reference to old list) [duplicate] 【发布时间】:2012-11-25 08:00:32 【问题描述】:

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

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

【问题讨论】:

这称为“深度克隆”。 是的,问题是深拷贝与浅拷贝。它实际上是编程语言中的一大堆蠕虫。有标准的克隆方法,但它们在浅层与深层方面的实现方式各不相同,并且从子类到子类相对不一致。我怀疑你最好使用 for 循环,除非你确信集合实现是你的。 【参考方案1】:

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

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

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);

【讨论】:

以上是关于将列表复制到另一个(新列表不应引用旧列表)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将可重复使用的多行/多列表从一个 Excel 工作表复制到另一个工作表上的数据库

Python 列表是如何工作的? [复制]

练习七:列表复制(将一个列表的数据复制到另一个列表中)

如何将所有列表元素添加到另一个列表中[重复]

如何将一个列表的所有元素附加到另一个列表? [复制]

如何在不影响 Flutter 中的原始列表的情况下将列表执行深层复制到另一个列表