0

我制作了两个名为listAlistB的List< Test> 。我在listA中保存了数据。我将数据从listA复制到listB。我更改了listB中的数据。当我更改 listB 中的数据时,也会更改listA - 是否可以避免这种情况?

我希望你能帮助我:o)

public class Test
{
    public string Name { get; set; }
}

static void Test()
    {
        List<Test> listA = new List<Test>();
        List<Test> listB = new List<Test>();

        listA.Add(new Test { Name = "A" });
        listB.AddRange(listA);

        //I change the data in listB and the data in listA also get changed. 
        listB.First().Name = "B";
        Console.WriteLine("listA: {0} listB: {1}", listA.First().Name, listB.First().Name);

        //Can I avoid the change of data in listA?
    }
4

4 回答 4

8

将对象listA添加到listB

listB.AddRange(listA.Select(t => new Test { Name = t.Name }));

目前,您只是将引用复制listA到中listB,这些引用指向同一个对象。这就是为什么通过修改它们listA会使更改在listB.

于 2013-01-29T20:28:15.617 回答
1

您将不得不创建Test对象的新实例。

您可以在测试类中添加一个复制方法,以便更轻松地使用 复制成员MemberwiseClone,如果您丢失了要复制的属性,而无需大的选择语句来填充每个属性,这将是一件好事。

public class Test
{
    public string Name { get; set; }

    public Test Copy()
    {
        return (Test)this.MemberwiseClone();
    }
}

然后,您可以在代码中需要的地方使用。

  List<Test> listA = new List<Test>();
  List<Test> listB = new List<Test>();
  listA.Add(new Test { Name = "A" });

  listB.AddRange(listA.Select(x => x.Copy()));
于 2013-01-29T20:53:00.543 回答
0

这也有效,因为 listB 中的 Test obj 是与 listA 中的 Test obj 不同的实例

 listA.ForEach((item) =>
    {
        listB.Add(new Test {Name = item.Name});
    });
于 2013-01-29T20:37:13.163 回答
0

对于更复杂的对象,您可以实现上面评论中描述的克隆方法:

public Test Clone()
{
     return new Test { Name = this.Name};
}

上面的代码将被修改如下:

listB.AddRange(listA.Select(t => t.Clone()));

There is also an ICloneable interface in .NET but it is not recommend to use this interface. I included a link to another question that contains a discussion of this interface.

Why should I implement ICloneable in c#?

于 2013-01-29T21:02:24.157 回答