我知道这已经被覆盖了,但是从我在post中所理解的应该是有用的。
示例代码:
我有自定义类型:
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);
从两个列表中删除
除非我完全遗漏了this帖子,否则我应该可以更改副本列表,而不会影响原件。
答案 0 :(得分:11)
您只需在原始列表中调用ToList()
即可生成副本。
答案 1 :(得分:3)
我非常确定您的代码应该有效。关于构造函数的MSDN说:
初始化List类的新实例,其中包含从指定集合中复制的元素,并且具有足够的容量来容纳复制的元素数。
你确定你没有错过任何东西吗?
修改强>
你确实错过了什么......你的例子错了,误导了。您的编辑显示您尝试从INSIDE类型中删除项目。复制父类时不会复制/克隆这些内容。您需要克隆班级的每个属性。看看Deep cloning objects。
答案 2 :(得分:2)
好吧,如果你认为copyMovies.RemoveAt(x)
而不是copyMovies.Movie.RemoveAt(x)
只是轻微的误会,那么对不起我的朋友,但你只是在这里浪费我们的时间。
内部列表已被引用复制,因此您需要复制整个内部列表,f.e:
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));