创建列表的副本<;t>;不参考原件

本文关键字:参考 gt 副本 列表 lt 创建 | 更新日期: 2023-09-27 17:59:44

我知道这之前已经讨论过了,但根据我在帖子中的理解,这应该是可行的。

示例代码:

我有一个自定义类型:

public class MyType
{
    public List<MySubType> Movie { get; set; }
    public List<int> Ranks { get; set; }
    public string Location { get; set; }
    public string Released { get; set; }
}

然后我创建一个这种类型的列表

List<MyType> myMovies = new List<MyType>();

在代码的后面,我需要创建这个列表的副本,并在不影响原始列表的情况下对其进行更改。

List<MyType> copyMovies = new List<MyType>(myMovies);

但现在如果我从copyMovies 内的列表中删除

copyMovies.Movie.RemoveAt(x);

它从两个列表中删除

除非我完全遗漏了什么,否则这篇帖子建议我应该能够在不影响原件的情况下更改副本列表。

创建列表的副本<;t>;不参考原件

您只需在原始列表上调用ToList(),它就会生成一个副本。

我非常确信您的代码应该可以工作。MSDN介绍了构造函数:

初始化List类的新实例,该实例包含从指定集合复制的元素,并且具有足够的容量来容纳复制的元素数。

你确定你没有错过任何东西吗?

编辑:

你确实错过了什么。。。你的例子是错误的和误导性的。你的编辑显示你试图从你的类型内的列表中删除一个项目。在复制父类时,不会复制/克隆这些类。您需要克隆类的每一个属性。看看深度克隆对象。

如果你认为copyMovies.RemoveAt(x)而不是copyMovies.Movie.RemoveAt(x)只是轻微失误,那么对不起我的朋友,但你只是在浪费我们的时间。

内部列表已被引用复制,因此您需要复制整个内部列表,例如:

List<MyType> copyMovies = new List<MyType>(myMovies.Select (m => new MyType()
{
    Movie = new List<MySubType>(m.Movie),
    Ranks = m.Ranks,
    Location = m.Location,
    Released = m.Released
}));

List<MyType> copyMovies = myMovies.Select (m => new MyType()
{
    Movie = new List<MySubType>(m.Movie),
    Ranks = m.Ranks,
    Location = m.Location,
    Released = m.Released
}).ToList();

或者使用复制构造函数:

//in MyType definition
public MyType(MyType objectToCopy)
{
    Movie = new List<MySubType>(m.Movie);
    Ranks = m.Ranks;
    Location = m.Location;
    Released = m.Released;
}

然后你就可以这样使用它了:

List<MyType> copyMovies = myMovies.Select (m => new MyType(m));