C# 独立复制列表<;T>;
我制作了两个名为listA和listB的列表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
公共类测试
{
公共字符串名称{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()));