创建List <t>的副本,而不参考原始</t>

时间:2014-04-24 11:34:15

标签: c# reference

我知道这已经被覆盖了,但是从我在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帖子,否则我应该可以更改副本列表,而不会影响原件。

3 个答案:

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