创建列表的副本<;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);
它从两个列表中删除
除非我完全遗漏了什么,否则这篇帖子建议我应该能够在不影响原件的情况下更改副本列表。
您只需在原始列表上调用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));