C# 独立复制列表<;T>;

C# 独立复制列表<;T>;,c#,C#,我制作了两个名为listA和listB的列表。 我在列表中保存了大量数据。 我将数据从列表A复制到列表B。 我更改了列表b中的数据。 当我在列表B中更改数据时,它也会在列表A中更改–是否可以避免这种情况 我希望你能帮助我:o) 公共类测试 { 公共字符串名称{get;set;} } 静态孔隙试验() { List listA=新列表(); List listB=新列表(); Add(新测试{Name=“A”}); listB.AddRange(listA); //我更改了listB中的数据,li

我制作了两个名为listAlistB的列表。 我在列表中保存了大量数据。 我将数据从列表A复制到列表B。 我更改了列表b中的数据。 当我在列表B中更改数据时,它也会在列表A中更改–是否可以避免这种情况

我希望你能帮助我:o)

公共类测试
{
公共字符串名称{get;set;}
}
静态孔隙试验()
{
List listA=新列表();
List listB=新列表();
Add(新测试{Name=“A”});
listB.AddRange(listA);
//我更改了listB中的数据,listA中的数据也会更改。
listB.First().Name=“B”;
WriteLine(“listA:{0}listB:{1}”、listA.First().Name、listB.First().Name);
//我可以避免更改listA中的数据吗?
}

将对象添加到
列表B
时,必须复制
列表A
中的对象:

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

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

中可见的原因,这也是因为listB中的Test obj与listA中的Test obj是不同的实例

 listA.ForEach((item) =>
    {
        listB.Add(new Test {Name = item.Name});
    });

您必须创建
Test
对象的新实例

您可以向测试类中添加一个copy方法,以便使用
MemberwiseClone
更容易地复制成员。如果您要复制的属性丢失,而不需要使用大的select语句来填充每个属性,这将是一件好事

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()));
List listA=新列表();
List listB=新列表();
Add(新测试{Name=“A”});
AddRange(listA.Select(x=>x.Copy());

对于更复杂的对象,您可以实现上述注释中所述的克隆方法:

public Test Clone()
{
     return new Test { Name = this.Name};
}
上述代码将修改如下:

listB.AddRange(listA.Select(t => t.Clone()));
NET中还有一个IClonable接口,但不建议使用此接口。我包含了一个指向另一个问题的链接,其中包含了对该接口的讨论


将类测试更改为结构测试,看看发生了什么您在这里有一个误解。无论
列表
实例不同,它们包含的
测试
实例都是相同的,因此如果您在
测试
实例中更改了某些内容,无论您通过哪个
列表
实例访问它,它都会被更改。的可能副本可能是的副本,您可以将复制部分封装到一个方法中,称为
Clone()
。谢谢李!我真正的测试类有15个属性。是否有一种不同的方法可以用来编写它们:listB.AddRange(listA.Select(t=>newtest{Name=t.Name,Name2=t.Name2…Name15=t.Name15}).ToList()?使用MemberwiseClone对我来说是最好的方式。谢谢
listB.AddRange(listA.Select(t => t.Clone()));