2011-12-21 104 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方法說明了這種方法。

  • 序列化要深度複製的對象,然後將序列化的數據恢復到不同的對象變量。

  • 使用遞歸反射來執行深層複製操作。

相關問題