2011-12-21 124 views
2

我有一个实体类,它的名字是Person。 Person实体有一个Asset实体的列表。如何将对象列表从实体复制到另一个实体

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public IList<Asset> Assets { get; set;} 
} 

例如我有两个人(person1 & person2)。我需要将资产清单从person1复制到person2。我这样做如下代码:

Person person1 = LoadById(1); 
Person person2 = LoadById(2); 

// person2.Assets = person1.Assets; // Is it correct? 

foreach(Asset item in person1.Assets) 
{ 
    //person2.Assets.Add(item); 
    Asset asset = new Asset(); 
    asset.Title = item.Title; 
    asset.Description = item.Description; 

    asset.Person = person2;   

    person2.Add(asset); 
}  

person2.Update(); 

有一个更好的方法来做到这一点?

+1

这会将相同的项目引用添加到第二个列表中。如果这不是所需的行为,则必须在将项目添加到资产列表之前克隆/深入克隆该项目。 – Dennis 2011-12-21 11:24:19

+0

@丹尼斯如何使用克隆? – Ehsan 2011-12-21 13:56:23

+0

这一个是伟大的:http://stackoverflow.com/questions/78536/cloning-objects-in-c-sharp – Dennis 2011-12-21 14:09:42

回答

3

Assets属性是对列表的引用。 person2.Assets = person1.Assets;意味着他们都分享并指向相同的列表,因此不会分开。

你想做的事:

person2.Assets = new List<Asset>(person1.Assets); 

(只是要检查是否超载,但应该复制的所有内容)......是的,应该这样做。

如果你想增加他们,而不是取代,使用此:

person2.Assets.AddRange(person1.Assets); 

你可能会重复,但是。你可以这样做,如果你不想这样做:Linq to entities : Unions + Distinct

此外,你有一个额外的() - 你的第一行应该是,public class Person

+0

问题已更新。 – Ehsan 2011-12-21 13:54:01

+0

'person2.Assets = person1.Assets'和'person2.Assets = new列表(person1.Assets)'之间有什么不同?两者都有一个结果。两者都指向同一份清单。我想通过新ID将person1中的资产列表复制到person2中的资产。现在person1和person2中的资产[0]的ID均相同。 – Ehsan 2011-12-21 13:54:13

+1

他们都有不同的结果。在'person2.Assets = person1.Assets;'有一个资产列表,它指向person1和person2之间(共享)。如果您向person1添加一个,则它也将在person2中可访问,因为它与列表完全相同。第二行创建列表的副本,因此可以独立修改它们。这几乎总是你想要的。 – 2011-12-21 14:47:48

0

作为一个起点,我推荐这个MSDN文档的MemberwiseClose method

这将使您的复制过程更具可读性。但请注意,这也只是创建一个副本的列表。

如果你真的需要一个副本,文章建议此策略:

有实现深拷贝操作如果由MemberwiseClone方法进行 浅拷贝操作不 未多种方式满足您的需求。这些包括如下:

  • 呼叫对象的类的构造函数被复制以产生具有从所述第一对象获取的属性值的第二个目的。这个 假定一个对象的值完全由它的类 构造函数定义。

  • 调用MemberwiseClone方法创建一个对象的浅表副本,然后分配新对象,它们的值是一样的 原始对象的任何属性或字段,其值是参考 类型。示例中的DeepCopy方法说明了这种方法。

  • 序列化要深度复制的对象,然后将序列化的数据恢复到不同的对象变量。

  • 使用递归反射来执行深层复制操作。

相关问题